天天看點

find指令

功能:在目錄結構中搜尋檔案,并執行指定的操作。此指令提供了相當多的查找條件,功能很強大。 

文法: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)。

上一篇: find指令
下一篇: find 指令

繼續閱讀