天天看點

linux查找技巧: find grep xargs

在目前目錄下所有.cpp檔案中查找efg函數

find . -name "*.cpp" | xargs grep 'efg'

xargs展開find獲得的結果,使其作為grep的參數

另外 rm mv等指令對大量檔案操作時報錯 -bash: /bin/rm: Argument list too long也可用xargs 解決

删除目前目錄下所有.cpp檔案

find . -name "*.cpp" | xargs rm

////////////////////////////////////////////////////////

find [起始目錄] 尋找條件 操作

還有種表述方式:find PATH OPTION [-exec COMMAND { } \;]

因為find指令會根據我們給的option,也就是尋找條件從我們給出的目錄開始對其中檔案及其下子目錄中的檔案進行遞歸搜尋,是以我覺的這個地方說是“起始目錄”是非常好的。

該指令中的尋找條件可以是一個用邏輯運算符 not、and、or 組成的複合條件。邏輯運 算符 and、or、not 的含義為:

(1) and:邏輯與,在指令中用“-a”表示,是系統預設的選項,表示隻有當所給的條 件都滿足時,尋找條件才算滿足。例如:

find –name ’tmp’ –xtype c -user ’inin’

% 該指令尋找三個給定條件都滿足的所有檔案

(2) or:邏輯或,在指令中用“-o”表示。該運算符表示隻要所給的條件中有一個滿足 時,尋找條件就算滿足。例如:

find –name ’tmp’ –o –name ’mina*’

% 該指令查詢檔案名為’tmp’或是比對’mina*’的所有檔案。

(3) not:邏輯非,在指令中用“!”表示。該運算符表示查找不滿足所給條件的檔案 。例如:

find ! –name ’tmp’

% 該指令查詢檔案名不是’tmp’的所有檔案。

需要說明的是:當使用很多的邏輯選項時,可以用括号把這些選項括起來。為了避免Shell本身對括号引起誤解,在話号前需要加轉義字元“\”來去除括号的意義。例:

find –name′tmp′–xtypecuser′inin′

我覺的現在我應該說下出了查詢條件,在find中的option的内容了:

在option中,具體有參數:

-name ’字串’ 查找檔案名比對所給字串的所有檔案,字串内可用通配符 *、?、[ ]。

-lname ’字串’ 查找檔案名比對所給字串的所有符号連結檔案,字串内可用通配符 *、?、[ ]。

-gid n 查找屬于ID号為 n 的使用者組的所有檔案。

-uid n 查找屬于ID号為 n 的使用者的所有檔案。

-group ’字串’ 查找屬于使用者組名為所給字串的所有的檔案。

-user ’字串’ 查找屬于使用者名為所給字串的所有的檔案。

-empty 查找大小為 0的目錄或檔案。

-path ’字串’ 查找路徑名比對所給字串的所有檔案,字串内可用通配符*、?、[ ]。

-perm 權限 查找具有指定權限的檔案和目錄,權限的表示可以如711,644。

-size n[bckw] 查找指定檔案大小的檔案,n 後面的字元表示機關,預設為 b,代表512位元組的塊。

-type x 查找類型為 x 的檔案,x 為下列字元之一:

b 塊裝置檔案

c 字元裝置檔案

d 目錄檔案

p 命名管道(FIFO)

f 普通檔案

l 符号連結檔案(symbolic links)

s socket檔案

-xtype x 與 -type 基本相同,但隻查找符号連結檔案。

以時間為條件查找

-amin n 查找n分鐘以前被通路過的所有檔案。

-atime n 查找n天以前被通路過的所有檔案。

-cmin n 查找n分鐘以前檔案狀态被修改過的所有檔案。

-ctime n 查找n天以前檔案狀态被修改過的所有檔案。

-mmin n 查找n分鐘以前檔案内容被修改過的所有檔案。

-mtime n 查找n天以前檔案内容被修改過的所有檔案。

-print:将搜尋結果輸出到标準輸出。

例子:在root以及子目錄查找不包括目錄/root/bin的,greek使用者的,檔案類型為普通檔案的,3天之前的名為test-find.c的檔案,并将結構輸出,find指令如下:

find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print

當然在這其中,-print是一個預設選項,我們不必刻意去配置它。

我們再看一下exec選項:

-exec:對搜尋的結構指令指定的shell指令。注意格式要正确:"-exec 指令 {} \;"

在}和\之間一定要有空格才行;

{}表示指令的參數即為所找到的檔案;指令的末尾必須以“ \;”結束。

例子:對上述例子搜尋出來的檔案進行删除操作,指令如下:

find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \;

find指令指令執行個體:

find . - name ‘main*’ - exec more {} \;

% 查找目前目錄中所有以main開頭的檔案,并顯示這些檔案的内容。

find . namea.outoname‘.o′> - atime +7 - exec rm {} \;

% 删除目前目錄下所有一周之内沒有被通路過的a .out或*.o檔案。

% 指令中的“.”表示目前目錄,此時 find 将從目前目錄開始,逐個在其子目錄中查找滿足後面指定條件的檔案。

% “”和“” 表示括号(),其中的 “\” 稱為轉義符。之是以這樣寫是由于對 Shell 而言,(和)另有不同的含義,而不是這裡的用于組合條件的用途。

% “-name a.out” 是指要查找名為a.out的檔案;

% “-name ‘*.o’” 是指要查找所有名字以 .o 結尾的檔案。

這兩個 -name 之間的 -o 表示邏輯或(or),即查找名字為a.out或名字以 .o結尾的檔案。

% find指令在目前目錄及其子目錄下找到這佯的檔案之後,再進行判斷,看其最後通路時間 是否在7天以前(條件 -atime +7),若是,則對該檔案執行指令 rm(-exec rm {} \;)。

其中 {} 代表目前查到的符合條件的檔案名,\;則是文法所要求的。

% 上述指令中第一行的最後一個 \ 是續行符。當指令太長而在一行寫不下時,可輸入一個 \,之後系統将顯示一個 >,訓示使用者繼續輸入指令。

本文轉自 轉身撞牆角 51CTO部落格,原文連結:http://blog.51cto.com/chentianwang/1683335