linux每日命令(22): find命令參數詳解

閱讀目錄(Content)html

 

 

一. name選項

文件名選項是find命令最經常使用的選項,要麼單獨使用該選項,要麼和其餘選項一塊兒使用。 可使用某種文件名模式來匹配文件,記住要用引號將文件名模式引發來。linux

無論當前路徑是什麼,若是想要在本身的根目錄$HOME中查找文件名符合*.log的文件,使用~做爲 'pathname'參數,波浪號~表明了你的$HOME目錄。shell

find ~ -name "*.log" 

 

想要在當前目錄及子目錄中查找全部的‘ *.log‘文件,能夠用:express

find . -name "*.log" 

 

想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,能夠用:apache

find . -name "[A-Z]*" 

 

想要在/etc目錄中查找文件名以host開頭的文件,能夠用:app

find /etc -name "host*" 

 

想要查找$HOME目錄中的文件,能夠用:工具

find ~ -name "*" 

 

要想讓系統高負荷運行,就從根目錄開始查找全部的文件。ui

find / -name "*" 

 

若是想在當前目錄查找文件名以一個個小寫字母開頭,最後是4到9加上.log結束的文件:spa

命令:code

find . -name "[a-z]*[4-9].log" -print

 

 

二. perm選項

按照文件權限模式用-perm選項,按文件權限模式來查找文件的話。最好使用十進制的權限表示法。
如在當前目錄下查找文件權限位爲755的文件,即文件屬主能夠讀、寫、執行,其餘用戶能夠讀、執行的文件,能夠用:

 find . -perm 755 

find -perm,根據文件的權限來查找文件,有三種形式:
find -perm mode
find -perm -mode
find -perm +mode

那麼這三者之間有什麼區別呢?解釋以前首先得簡單說一下linux中文件權限位的概念。在linux中文件或目錄有三者權限r,w,x,表明的含義分別是讀、寫、可執行。而一個文件或目錄的屬性中又包括所屬用戶u、所屬組g、其餘o三個部分的屬性,分別表示所屬用戶、所屬組、其餘用戶對這個文件所擁有的權限。看起來大概是這個樣子:
所屬用戶 所屬組 其餘
rwx rwx rwx

用戶在其擁有權限的位上設置1,沒有權限的位設置0。若是將每一個部分的這些權限位當作二進制數,每一個部分能夠用3位二進制數表示,最大值爲7(2^3-1),表示可讀、可寫、可執行。嚴格的來講,文件權限除了r、w、x之外還有setuid,setgid權限,等下再解釋。
好了,有了權限位的基礎,那麼再來看find -perm mode。mode是三個數字表示的,每一個數字最大值是7(緣由前面解釋過了)。
find -perm mode , 表示嚴格匹配,也就是你的文件權限位轉換成對應的十進制數字與mode如出一轍,那麼匹配成功,須要注意的是若是mode給的數字不足3位,那麼前面自動添0(嚴格的說是不足4位,緣由就是前面所說的setuid,setgid,稍後解釋)

find -perm -mode , 表示mode中轉換成二進制的1在文件權限位裏面必須匹配,好比mode=644那麼轉換成二進制爲110 100 100,而被查找的文件的權限位也能夠被轉換成一個二進制數,二者在位上爲1的部分必須徹底匹配,而0則無論。例如被查找的文件的權限爲轉換成二進制數是111 111 111那麼這個好比被匹配,而假如是100 100 100那麼則不會匹配。因此這個'-'的做用歸結起來就是匹配比mode權限更充足的文件(找不到什麼詞語來形容了)

find -perm +mode , 與 -mode的區別是+mode只需其中的任意一個1的部分被匹配,-mode是全部1的部分都必須被匹配,一樣+mode也無論0位。

如今來解釋setuid,setgid,setuid權限是用來使其餘用戶能夠「越權」執行你的命令,而本質上的實現就是在權限檢查的時候,在進程的的有效UID裏面保存了這個其餘用戶的UID,因此權限得驗證經過,這些權限用一個新的3位二進制數表示,有4,2,1三種值,4表示有setuid權限,2表示有setgid權限,1表示有粘着位(t)權限(粘着位權限最典型的例子是/tmp,每一個用戶能夠在裏面建立、更新、刪除本身建立(文件所屬用戶是本身)的文件,而不能更改別人的文件)。

$ ls -l 
total 0
-rwxrwxrwx 1   fai     root       0 Aug 28 15:15 a
-rwxr-xr-x    1   fai     root       0 Aug 28 15:15 b
----rw----     1   fai     root       0 Aug 28 15:15 c
-rw-rw-rw-  1   fai     root       0 Aug 28 15:15 d
-r-xr--r--      1   fai     root       0 Aug 28 15:15 e

對於權限進行十進制轉2進制
a(777):111 111 111
b(755):111 101 101
c(060): 000 110 000
d(666):110 110 110
e(544):101 100 100

$ find . -perm +006
.
./b
./d
./a
./e

mode中的006轉爲2進制是:000 000110
根據部分匹配的原則,只要在第3組中的第一或者第二位出現1就能夠了,因此看到e文件101只是匹配了第一位的1,可是也打印了。

而a文件111的狀況更是符合這個說法了。注意:c文件雖然出現了110,可是不是對應的組,這個匹配是在相應位的。

$ find . -perm -006
./d
./a

對於-perm -006,也一樣道理去判斷,只是這裏須要徹底匹配,也就是mode的二進制中出現1的地方,目標中也要出現才行
須要在最後一組中的第一和第二位同時出現1才能匹配。
a(777):111 111 111
d(666):110 110 110

三. prune選項(此處引用http://blog.sina.com.cn/s/blog_6ad648f30100tqwy.html)

查找時忽略指定目錄,是要使用-prune選項,但實際上最重要的仍是要和path配合。-prune的意義是,當路徑字串匹配了path中指定的目錄時 候,find命令不進入這個目錄查找,因此這個選項使用的關鍵,仍是在path選項上的使用,也就是path選項和其餘選項的配合使用,才能最後肯定最終 結果。而path,其實是對路徑字串的一個字符匹配,但也並不只僅只匹配於目錄,文件一樣能夠被匹配,譬如存在一個目錄結構。

./01.txt
./02.txt
./03.txt
./aaa
./aaa/04.txt
./aaa/05.txt

find . -path "./aaa" -print 匹配中使用通配符,則會輸出

./aaa
./aaa/04.txt
./aaa/05.txt

而若是是find . -path "./aaa" -print ,嚴格等於./aaa目錄,則只輸出

./aaa

並且*通配符會將路徑中的字符"/"也做爲普通字符進行貪婪匹配,因此能夠匹配到目錄如下的文件,因此在使用這個選項時候不要誤覺得這個只對目錄有效,實際上只是一種路徑字符匹配工具。

1.查找文件時,忽略某個目錄

若是加上-prune,則第一個命令效果是:

find . -path "./aaa*" -prune -print

./aaa

由於加入了-prune,在匹配這個目錄同時禁止進入到這個目錄下搜索,因而也就是咱們所須要的不進入某個目錄查找。

但如何配合其餘選項來使用-path 以及-prune呢?以-name爲例,下面對於配合使用方法進行一下演示。

咱們先來看看純粹的-name和-path配合使用是什麼效果:

find -name "*.txt" -path "./aaa" -print

這個命令也至關於

find -name "*.txt" -a -path "./aaa" -print

但通常的-a都被忽略不寫。這個命令對於上面的目錄結構這個命令執行爲空結果。也就是,既要文件名稱匹配".txt",同時又要其路徑字 串匹配"./aaa",而文件名匹配".txt"的結果有:

./01.txt
./02.txt
./03.txt
./aaa/04.txt
./aaa/05.txt

路徑字串匹配 "./aaa"的只有
./aaa
兩者取and則爲空結果,因此上面的命令輸出爲空。

若是對-path選項加上-prune

find -name "*.txt" -path "./aaa" -prune -print

實際上與上面那條命令輸出並沒有區別,只是禁止進入./aaa下匹配而已,但最終的結果仍然是空。

再來看看不少人會誤用的結構:

find -name "*.txt" -path "./aaa" -prune -o -print

也就是比上一條語句在-print前增長一個-o。但實際上這條命令是將當前目錄以及包含./aaa子目錄下的全部文件都打印出來。實際上
,這個語句先執行-o左側的語句,find -name "*.txt" -path "./aaa" -prune,由於匹配爲空,則執行-o右側的語句-print,也就是把不匹配左側的文件名打印出來,既然左側沒有匹配爲真的,因此也就是全部的文件都被打印。

這裏要留意的是匹配模式項(好比-name "*.txt", -path ....),關係符( -a, -o, ","),與操做符(-print, -exec,- ok)之間的位置關係,特別是操做符在關係符的不一樣位置上,對於結果也具備決定的做用。

說明:

find [-path ..] [expression]

在路徑列表的後面的是表達式

-path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的簡寫表達式按順序求值, -a 和 -o 都是短路求值,與 shell 的 && 和 || 相似若是

-path "test" 爲真,則求值 -prune , -prune 返回真,與邏輯表達式爲真;不然不求值 -prune,與邏輯表達式爲假。若是 -path "test" -a -prune 爲假,則求值 -print ,-print返回真,或邏輯表達式爲真;不然不求值 -print,或邏輯表達式爲真。

這個表達式組合特例能夠用僞碼寫爲:

if -path "test" then

-prune

else

-print

好比一個語句

find -name "*.txt" -print -o -path "./aaa" -prune -print             (1)

其實也能夠略寫爲

find -name "*.txt" -o -path "./aaa" -prune

注意第二個語句-o兩側都沒有-print,輸出結果爲:

./01.txt
./02.txt
./03.txt
./aaa 

這是由於find開始執行,遇到第一個-print命令,則會考慮輸出,可是輸出的時候,則是將剩餘全部的匹配項一塊兒進行匹配操做,也就是執行的是

find -name "*.txt" -print -o -path "./aaa" -prune  (注意-print命令的位置)

這個命令執行中至關於

find -path "./aaa" -prune -o -name "*.txt" -print

也 就是在匹配過程當中,對於包含了-print部分的匹配項是最後匹配的,所以先匹配到了./aaa路徑,因爲-prune的存在禁止進入這個路徑查找,禁止 進入查找,並不會由於-o選項而被逆轉,因此左側匹配了./aaa後,-o右側則是不匹配./aaa項目剩餘的文件繼續去匹配-name模式,匹配的結果 最後被-print打印出來,這也就是咱們所期待的忽略某個指定目錄進行搜索的結果。

可是咱們要分析的是命令(1)中的結果,命令(1)在遇到第一個-print命令後並執行了輸出,可是這個find命令中還存在第二個-print命令,因此在輸出

./01.txt
./02.txt
./03.txt

結果後,仍是要繼續執行,要執行最後一個-print命令,下面的執行則至關於執行一個

find -name "*.txt" -o -path "./aaa" -prune -print

-o左側匹配-name "*.txt",-o到右側後則是對不能匹配到-name模式的結果,進行-path匹配,輸出結果爲
./aaa
因此(1)命令最終的輸出結果就是

./01.txt
./02.txt
./03.txt
./aaa 。

 

2. 忽略多個文件夾

-a, -o都常見了,可是實際中還能夠存在「,「的使用,例如新建一個aaa1目錄,其下有08.txt等文件,若執行

$ find -name "*.txt"
./01.txt
./02.txt
./03.txt
./aaa/04.txt
./aaa/05.txt
./aaa1/08.txt
./aaa1/09.txt

若忽略aaa和aaa1目錄查找txt文件,則能夠寫作

$ find -name "*.txt" -print -o -path "./aaa" -prune , -path "./aaa1"  -prune  (注意","兩側的空格不可忽略)
./01.txt
./02.txt
./03.txt

這也就是同時忽略幾個目錄的寫法,注意每忽略一個目錄,其後都要跟隨一個-prune,而不能幾個-path公用一個-prune。

其實若沒有-prune的使用,也能夠忽略某個目錄下文件的匹配,譬如

$find -path "./aaa*" -o -name "*.txt" -print
./01.txt
./02.txt
./03.txt

一樣能夠不匹配到./aaa目錄下的文件,可是這裏其實是搜索過./aaa目錄下的文件而且進行匹對的,只是由於-print在-o的右側輸出,

而./aaa下的文件被匹配是在-o的左側,因此最終的結果是達不到被打印輸出的條件。但效率應當是明顯低於使用-prune選項。

 

四. user和nouser 選項

1. 在$HOME目錄中查找文件屬主爲hc的文件

find ~ -user hc -print

 

2. 在/etc目錄下查找文件屬主爲hc的文件:

find /etc -user hc -print

 

3. 爲了查找屬主賬戶已經被刪除的文件,可使用-nouser選項。在/home目錄下查找全部的這類文件

find /home -nouser -print

說明:

這樣就可以找到那些屬主在/etc/passwd文件中沒有有效賬戶的文件。在使用-nouser選項時,沒必要給出用戶名; find命令可以爲你完成相應的工做。

五.使用group和nogroup選項:

就像user和nouser選項同樣,針對文件所屬於的用戶組, find命令也具備一樣的選項,爲了在/apps目錄下查找屬於gem用戶組的文件,能夠用:

find /apps -group gem -print 

要查找沒有有效所屬用戶組的全部文件,可使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件:

find / -nogroup -print

 

六.按照更改時間或訪問時間等查找文件:

若是但願按照更改時間來查找文件,可使用mtime,atime或ctime選項。若是系統忽然沒有可用空間了,頗有可能某一個文件的長度在此期間增加迅速,這時就能夠用mtime選項來查找這樣的文件。

用減號-來限定更改時間在距今n日之內的文件,而用加號+來限定更改時間在距今n日之前的文件。

但願在系統根目錄下查找更改時間在5日之內的文件,能夠用:

find / -mtime -5 -print

爲了在/var/adm目錄下查找更改時間在3日之前的文件,能夠用:

ind /var/adm -mtime +3 -print

 

七.查找比某個文件新或舊的文件:

若是但願查找更改時間比某個文件新但比另外一個文件舊的全部文件,可使用-newer選項。

它的通常形式爲:

newest_file_name ! oldest_file_name  

其中,!是邏輯非符號。

1.查找更改時間比文件log1新但比文件log3舊的文件

命令:

find -newer log1  ! -newer log3

 

2.查找當前目錄下更改時間在比log2文件新的文件

命令:

find . -newer log2  -print

 

八.使用type選項:

1:在/etc目錄下查找全部的目錄

find /etc -type d -print  

 

2:在當前目錄下查找除目錄之外的全部類型的文件

find . ! -type d -print

 

3:在/etc目錄下查找全部的符號連接文件

find /etc -type l -print

 

九.使用size選項:

能夠按照文件長度來查找文件,這裏所指的文件長度既能夠用塊(block)來計量,也能夠用字節來計量。以字節計量文件長度的表達形式爲N c;以塊計量文件長度只用數字表示便可。

在按照文件長度查找文件時,通常使用這種以字節表示的文件長度,在查看文件系統的大小,由於這時使用塊來計量更容易轉換。

1:在當前目錄下查找文件長度大於1 M字節的文件

find . -size +1000000c -print

 

2:在/home/apache目錄下查找文件長度剛好爲100字節的文件:

find /home/apache -size 100c -print

 

3:在當前目錄下查找長度超過10塊的文件(一塊等於512字節)

find . -size +10 -print

 

十.使用depth選項:

在使用find命令時,可能但願先匹配全部的文件,再在子目錄中查找。使用depth選項就可使find命令這樣作。這樣作的一個緣由就是,當在使用find命令向磁帶上備份文件系統時,但願首先備份全部的文件,其次再備份子目錄中的文件。

1:find命令從文件系統的根目錄開始,查找一個名爲CON.FILE的文件。

find / -name "CON.FILE" -depth -print

說明:

它將首先匹配全部的文件而後再進入子目錄中查找

 

十一.使用mount選項:

在當前的文件系統中查找文件(不進入其餘文件系統),可使用find命令的mount選項。

1:從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件

find . -name "*.XC" -mount -print
相關文章
相關標籤/搜索