find 命令全面解析

urgel_babay發表於2016-03-01

功能:在目錄結構中搜尋檔案,並執行指定的操作。此命令提供了相當多的查詢條件,功能很強大。 
語法:find 起始目錄 尋找條件 操作 
說明:find命令從指定的起始目錄開始,遞迴地搜尋其各個子目錄,查詢滿足尋找條件的檔案並對之採取相關的操作。 

  該命令提供的尋找條件可以是一個用邏輯運算子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’ –xtype c -user ’inin’ ) 
  尋找條件有以下選項: 
  首先,下列各個選項中的n值可以有三種輸入方式,假設n為20,則: 
  +20 表示20以後(21,22,23等) 
  -20 表示20以前(19,18,17等) 
   20 表示正好是20 

  1. 以名稱和檔案屬性查詢。 
  - name ’字串’ 查詢檔名匹配所給字串的所有檔案,字串內可用萬用字元*、?、[ ]。 
  - lname ’字串’ 查詢檔名匹配所給字串的所有符號連結檔案,字串內可用萬用字元*、?、[ ]。 
  -gid n 查詢屬於ID號為n的使用者組的所有檔案。 
  -uid n 查詢屬於ID號為n的使用者的所有檔案。 
  -group ’字串’ 查詢屬於使用者組名為所給字串的所有的檔案。 
  -user ’字串’ 查詢屬於使用者名稱為所給字串的所有的檔案。 

     -nogroup 查詢無有效所屬組的檔案,即該檔案所屬的組在/ e t c / g r o u p s中不存在。 
     -nouser 查詢無有效屬主的檔案,即該檔案的屬主在/ e t c / p a s s w d中不存在。 
     -newer file1 ! file2 查詢更改時間比檔案f i l e 1新但比檔案f i l e 2舊的檔案。 
  -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基本相同,但只查詢符號連結檔案。 

  2. 以時間為條件查詢 
  - amin n 查詢n分鐘以前被訪問過的所有檔案。 
  - atime n 查詢n天以前被訪問過的所有檔案。 
  - cmin n 查詢n分鐘以前檔案狀態被修改過的所有檔案。 
  - ctime n 查詢n天以前檔案狀態被修改過的所有檔案。 
  - mmin n 查詢n分鐘以前檔案內容被修改過的所有檔案。 
  - mtime n 查詢n天以前檔案內容被修改過的所有檔案。 

  3. 可執行的操作 
  - exec 命令名稱 {} \;  對符合條件的檔案執行所給的unix 命令,而不詢問使用者是否需要執行該命令。{}表示命令的引數即為所找到的檔案,命令的末尾必須以“ \;”結束,"{}"和"\;"之間必須有一個空格。 
  - ok 命令名稱 {} \;  對符合條件的檔案執行所給的Linux 命令,與exec不同的是,它會詢問使用者是否需要執行該命令。 
  - ls 詳細列出所找到的所有檔案。 
  - fprintf 檔名 將找到的檔名寫入指定檔案。 
  - print 在標準輸出裝置上顯示查詢出的檔名。 
  - printf 格式 格式的寫法請參考有關C語言的書。

使用name選項 
檔名選項是f i n d命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。 
可以使用某種檔名模式來匹配檔案,記住要用引號將檔名模式引起來。 
不管當前路徑是什麼,如果想要在自己的根目錄$ H O M E中查詢檔名符合* . t x t的檔案, 
使用~作為' p a t h n a m e引數,波浪號~代表了你的$ H O M E目錄。 
$ find ~ -name "*.txt" -print 
想要在當前目錄及子目錄中查詢所有的' * . t x t'檔案,可以用: 
$ find . -name "*.txt" -print 
想要的當前目錄及子目錄中查詢檔名以一個大寫字母開頭的檔案,可以用: 
$ find . -name "[A-Z]*" -print 
想要在/ e t c目錄中查詢檔名以h o s t開頭的檔案,可以用: 
$ find /etc -name "host*" -print 
想要查詢$ H O M E目錄中的檔案,可以用: 
$ find ~ -name "*" -print 或find . -print 
要想讓系統高負荷執行,就從根目錄開始查詢所有的檔案。如果希望在系統管理員那裡 
保留一個好印象的話,最好在這麼做之前考慮清楚! 
$ find / -name "*" -print 
如果想在當前目錄查詢檔名以兩個小寫字母開頭,跟著是兩個數字,最後是* . t x t的文 
件,下面的命令就能夠返回名為a x 3 7 . t x t的檔案: 

$ find . -name "[a-z][a-z][0--9][0--9].txt" -print


使用perm選項 
如果希望按照檔案許可權模式來查詢檔案的話,可以採用- p e r m選項。你可能需要找到所有 
使用者都具有執行許可權的檔案,或是希望檢視某個使用者目錄下的檔案許可權型別。在使用這一選 
項的時候,最好使用八進位制的許可權表示法。 
為了在當前目錄下查詢檔案許可權位為7 5 5的檔案,即檔案屬主可以讀、寫、執行,其他用 
戶可以讀、執行的檔案,可以用: 
$ find . -perm 755 -print 
如果希望在當前目錄下查詢所有使用者都可讀、寫、執行的檔案(要小心這種情況),我們 
可以使用f i n d命令的- p e r m選項。在八進位制數字前面要加一個橫槓-。在下面的命令中- p e r m代 
表按照檔案許可權查詢,而' 0 0 7'和你在c h m o d命令的絕對模式中所採用的表示法完全相同。 
$ find . -perm -007 -print 
忽略某個目錄 
如果在查詢檔案時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查詢的檔案, 
那麼可以使用- p r u n e選項來指出需要忽略的目錄。在使用- p r u n e選項時要當心,因為如果你同 
時使用了- d e p t h選項,那麼- p r u n e選項就會被f i n d命令忽略。 
如果希望在/ a p p s目錄下查詢檔案,但不希望在/ a p p s / b i n目錄下查詢,可以用: 
$ find /apps -name "/apps/bin" -prune -o -print


使用user和nouser選項 
如果希望按照檔案屬主查詢檔案,可以給出相應的使用者名稱。例如,在$ H O M E目錄中查詢 
檔案屬主為d a v e的檔案,可以用: 
$ find ~ -user dave -print 
在/ e t c目錄下查詢檔案屬主為u u c p的檔案: 
$ find /etc -user uucp -print 
為了查詢屬主帳戶已經被刪除的檔案,可以使用- n o u s e r選項。這樣就能夠找到那些屬主 
在/ e t c / p a s s w d檔案中沒有有效帳戶的檔案。在使用- n o u s e r選項時,不必給出使用者名稱; f i n d命令 
能夠為你完成相應的工作。例如,希望在/ h o m e目錄下查詢所有的這類檔案,可以用: 
$ find /home -nouser -print 
使用group和nogroup選項 
就像u s e r和n o u s e r選項一樣,針對檔案所屬於的使用者組, f i n d命令也具有同樣的選項,為 
了在/ a p p s目錄下查詢屬於a c c t s使用者組的檔案,可以用: 
$ find /apps -group accts -print 
要查詢沒有有效所屬使用者組的所有檔案,可以使用n o g r o u p選項。下面的f i n d命令從檔案 
系統的根目錄處查詢這樣的檔案 
$ fine/-nogroup-print


按照更改時間查詢檔案 
如果希望按照更改時間來查詢檔案,可以使用m t i m e選項。如果系統突然沒有可用空間了, 
很有可能某一個檔案的長度在此期間增長迅速,這時就可以用m t i m e選項來查詢這樣的檔案。 
用減號-來限定更改時間在距今n日以內的檔案,而用加號+來限定更改時間在距今n日以前的 
檔案。 
希望在系統根目錄下查詢更改時間在5日以內的檔案,可以用: 
$ find / -mtime -5 -print 
為了在/ v a r / a d m目錄下查詢更改時間在3日以前的檔案,可以用: 
$ find /var/adm -mtime +3 -print 
查詢比某個檔案新或舊的檔案 
如果希望查詢更改時間比某個檔案新但比另一個檔案舊的所有檔案,可以使用- n e w e r選 
項。它的一般形式為: 
newest_file_name ! oldest_file_name 
其中,!是邏輯非符號。 
這裡有兩個檔案,它們的更改時間大約相差兩天。 
下面給出的f i n d命令能夠查詢更改時間比檔案a g e . a w k新但比檔案b e l t s . a w k舊的檔案: 
如果想使用f i n d命令的這一選項來查詢更改時間在兩個小時以內的檔案,除非有一個現成 
的檔案其更改時間恰好在兩個小時以前,否則就沒有可用來比較更改時間的檔案。為了解決 
這一問題,可以首先建立一個檔案並將其日期和時間戳設定為所需要的時間。這可以用t o u c h 
命令來實現。 
假設現在的時間是2 3 : 4 0,希望查詢更改時間在兩個小時以內的檔案,可以首先建立這樣 
一個檔案: 
一個符合要求的檔案已經被建立;這裡我們假設今天是五月四日,而該檔案的更改時間 
是2 1 : 4 0,比現在剛好早兩個小時。 
現在我們就可以使用f i n d命令的- n e w e r選項在當前目錄下查詢所有更改時間在兩個小時以 
內的檔案: 
$ find . -newer dstamp -print


使用type選項 
U N I X或L I N U X系統中有若干種不同的檔案型別,這部分內容我們在前面的章節已經做了
介紹,這裡就不再贅述。如果要在/ e t c目錄下查詢所有的目錄,可以用: 
$ find /etc -type d -print 
為了在當前目錄下查詢除目錄以外的所有型別的檔案,可以用: 
$ find . ! -type d -print 
為了在/ e t c目錄下查詢所有的符號連結檔案,可以用: 
$ find /etc -type l -print


使用size選項 
可以按照檔案長度來查詢檔案,這裡所指的檔案長度既可以用塊( b l o c k)來計量,也可 
以用位元組來計量。以位元組計量檔案長度的表達形式為N c;以塊計量檔案長度只用數字表示即 
可。 
就我個人而言,我總是使用以位元組計的方式,在按照檔案長度查詢檔案時,大多數人都 
喜歡使用這種以位元組表示的檔案長度,而不用塊的數目來表示,除非是在檢視檔案系統的大 
小,因為這時使用塊來計量更容易轉換。 
為了在當前目錄下查詢檔案長度大於1 M位元組的檔案,可以用: 
$ find . -size +1000000c -print 
為了在/ h o m e / a p a c h e目錄下查詢檔案長度恰好為1 0 0位元組的檔案,可以用: 
$ find /home/apache -size 100c -print 
為了在當前目錄下查詢長度超過1 0塊的檔案(一塊等於5 1 2位元組),可以用: 
$ find . -size +10 -print


使用depth選項 
在使用f i n d命令時,可能希望先匹配所有的檔案,再在子目錄中查詢。使用d e p t h選項就 
可以使f i n d命令這樣做。這樣做的一個原因就是,當在使用f i n d命令向磁帶上備份檔案系統時, 
希望首先備份所有的檔案,其次再備份子目錄中的檔案。 
在下面的例子中, f i n d命令從檔案系統的根目錄開始,查詢一個名為C O N . F I L E的檔案。 
它將首先匹配所有的檔案然後再進入子目錄中查詢。 
$ find / -name "CON.FILE" -depth -print


使用mount選項 
在當前的檔案系統中查詢檔案(不進入其他檔案系統),可以使用f i n d命令的m o u n t選項。 
在下面的例子中,我們從當前目錄開始查詢位於本檔案系統中檔名以X C結尾的檔案: 
$ find . -name "*.XC" -mount -print 
使用cpio選項 
c p i o命令可以用來向磁帶裝置備份檔案或從中恢復檔案。可以使用f i n d命令在整個檔案系 
統中(更多的情況下是在部分檔案系統中)查詢檔案,然後用c p i o命令將其備份到磁帶上。 
如果希望使用c p i o命令備份/ e t c、/ h o m e和/ a p p s目錄中的檔案,可以使用下面所給出的命令,不過要記住你是在檔案系統的根目錄下:
(在上面的例子中,第一行末尾的\告訴s h e l l命令還未結束,忽略\後面的回車。) 
在上面的例子中,應當注意到路徑中缺少/。這叫作相對路徑。之所以使用相對路徑,是 
因為在從磁帶中恢復這些檔案的時候,可以選擇恢復檔案的路徑。例如,可以將這些檔案先 
恢復到另外一個目錄中,對它們進行某些操作後,再恢復到原始目錄中。如果在備份時使用 
了絕對路徑,例如/ e t c,那麼在恢復時,就只能恢復到/ e t c目錄中去,別無其他選擇。在上面 
的例子中,我告訴f i n d命令首先進入/ e t c目錄,然後是/ h o m e和/ a p p s目錄,先匹配這些目錄下的檔案,然後再匹配其子目錄中的檔案,所有這些結果將透過管道傳遞給c p i o命令進行備份。 
順便說一下,在上面的例子中c p i o命令使用了C 6 5 5 3 6選項,我本可以使用B選項,不過這 
樣每塊的大小隻有5 1 2 位元組,而使用了C 6 5 5 3 6 選項後,塊的大小變成了6 4 K 位元組 
(6 5 5 3 6 / 1 0 2 4)。


使用exec或ok來執行shell命令 
當匹配到一些檔案以後,可能希望對其進行某些操作,這時就可以使用- e x e c選項。一旦 
f i n d命令匹配到了相應的檔案,就可以用- e x e c選項中的命令對其進行操作(在有些作業系統 
中只允許- e x e c選項執行諸如l s或ls -l這樣的命令)。大多數使用者使用這一選項是為了查詢舊文 
件並刪除它們。這裡我強烈地建議你在真正執行r m命令刪除檔案之前,最好先用l s命令看一 
下,確認它們是所要刪除的檔案。 
e x e c選項後面跟隨著所要執行的命令,然後是一對兒{ },一個空格和一個\,最後是一個 
分號。 
為了使用e x e c選項,必須要同時使用p r i n t選項。如果驗證一下f i n d命令,會發現該命令只 
輸出從當前路徑起的相對路徑及檔名。 
為了用ls -l命令列出所匹配到的檔案,可以把ls -l命令放在f i n d命令的- e x e c選項中,例如: 
上面的例子中,f i n d命令匹配到了當前目錄下的所有普通檔案,並在- e x e c選項中使用ls -l 
命令將它們列出。 
為了在/ l o g s目錄中查詢更改時間在5日以前的檔案並刪除它們,可以用: 
$ find logs -type f -mtime +5 -exec rm {} \; 
記住,在s h e l l中用任何方式刪除檔案之前,應當先檢視相應的檔案,一定要小心! 
當使用諸如m v或r m命令時,可以使用- e x e c選項的安全模式。它將在對每個匹配到的檔案 
進行操作之前提示你。在下面的例子中, f i n d命令在當前目錄中查詢所有檔名以. L O G結尾、 
更改時間在5日以上的檔案,並刪除它們,只不過在刪除之前先給出提示。 
按y鍵刪除檔案,按n鍵不刪除。 
任何形式的命令都可以在- e x e c選項中使用。在下面的例子中我們使用g r e p命令。f i n d命令 

首先匹配所有檔名為" p a s s w d *"的檔案,例如p a s s w d、p a s s w d . o l d、p a s s w d . b a k,然後執 
行g r e p命令看看在這些檔案中是否存在一個r o u n d e r使用者。 
find命令的例子 
我們已經介紹了f i n d命令的基本選項,下面給出f i n d命令的一些其他的例子。 
為了匹配$ H O M E目錄下的所有檔案,下面兩種方法都可以使用: 
$ find $HOME -print 
$ find ~ -print 
為了在當前目錄中查詢s u i d置位,檔案屬主具有讀、寫、執行許可權,並且檔案所屬組的用 
戶和其他使用者具有讀和執行的許可權的檔案,可以用: 
$ find . -type f -perm 4755 -print 
為了查詢系統中所有檔案長度為0的普通檔案,並列出它們的完整路徑,可以用: 
$ find / -type f -size 0 -exec ls -l {} \; 
為了查詢/ v a r / l o g s目錄中更改時間在7日以前的普通檔案,並刪除它們,可以用: 
$ find /var/logs -type f -mtime +7 -exec rm {} \; 
為了查詢系統中所有屬於a u d i t組的檔案,可以用: 
$find /-name -group audit -print 
我們的一個審計系統每天建立一個審計日誌檔案。日誌檔名的最後含有數字,這樣我 
們一眼就可以看出哪個檔案是最新的,哪個是最舊的。A d m i n . l o g 檔案編上了序號: 
a d m i n . l o g . 0 0 1、a d m i n . l o g . 0 0 2等等。下面的f i n d命令將刪除/ l o g s目錄中訪問時間在7日以前、 
含有數字字尾的a d m i n . l o g檔案。該命令只檢查三位數字,所以相應日誌檔案的字尾不要超過 
9 9 9。 
$ find /logs -name 'admin.log[0-9][0-9][0-9] '-atime +7 -exec rm {} \; 
為了查詢當前檔案系統中的所有目錄並排序,可以用: 
$ find . -type d -print -local -mount |sort 
為了查詢系統中所有的r m t磁帶裝置,可以用: 
$ find /dev/rmt -print


xargs 
在使用find命令的-exec選項處理匹配到的檔案時, f i n d命令將所有匹配到的檔案一起傳遞 
給e x e c執行。不幸的是,有些系統對能夠傳遞給e x e c的命令長度有限制,這樣在f i n d命令執行 
幾分鐘之後,就會出現溢位錯誤。錯誤資訊通常是"引數列太長"或"引數列溢位"。這就是 
x a rg s命令的用處所在,特別是與f i n d命令一起使用。F i n d命令把匹配到的檔案傳遞給x a rg s命 
令,而x a rg s命令每次只獲取一部分檔案而不是全部,不像- e x e c選項那樣。這樣它可以先處理 
最先獲取的一部分檔案,然後是下一批,並如此繼續下去。在有些系統中,使用- e x e c選項會 
為處理每一個匹配到的檔案而發起一個相應的程式,並非將匹配到的檔案全部作為引數一次 
執行;這樣在有些情況下就會出現程式過多,系統效能下降的問題,因而效率不高;而使用 

x a rg s命令則只有一個程式。另外,在使用x a rg s命令時,究竟是一次獲取所有的引數,還是分 
批取得引數,以及每一次獲取引數的數目都會根據該命令的選項及系統核心中相應的可調參 
數來確定。 
讓我們來看看x a rg s命令是如何同f i n d命令一起使用的,並給出一些例子。 
下面的例子查詢系統中的每一個普通檔案,然後使用x a rg s命令來測試它們分別屬於哪類 
檔案: 
下面的例子在整個系統中查詢記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到 
/tmp/core.log 檔案中: 
$ find . -name "core" -print | xargs echo "" >/tmp/core.log 
下面的例子在/apps/audit目錄下查詢所有使用者具有讀、寫和執行許可權的檔案,並收回相應 
的寫許可權: 
$ find /apps/audit -perm -7 -print | xargs chmod o-w 
在下面的例子中,我們用grep命令在所有的普通檔案中搜尋device這個詞: 
$ find / -type f -print | xargs grep "device" 
在下面的例子中,我們用g r e p命令在當前目錄下的所有普通檔案中搜尋D B O這個詞: 
$ find . -name \ *-type f -print | xargs grep "DBO" 
注意,在上面的例子中, \用來取消f i n d命令中的*在s h e l l中的特殊含義。 

find命令是一個非常優秀的工具,它可以按照使用者指定的準則來匹配檔案。使用exec和xargs可以使使用者對所匹配到的檔案執行幾乎所有的命令。

轉自: http://blog.chinaunix.net/uid-20082146-id-83489.html

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30936525/viewspace-2018413/,如需轉載,請註明出處,否則將追究法律責任。