#find [搜索范圍] [匹配條件]
-------------------------------------------------
1. 根據(jù)文件名稱進行
find
檢索
find
命令中的 -name 選項可以根據(jù)文件名稱進行檢索(區(qū)分大小寫)。如需要忽略文件名中的大小寫,可以使用 -iname 選項。
-name 區(qū)分大小寫
-iname 不分區(qū)大小寫
? 可以表示任意一個單一的符號
* 可以表示任意數(shù)量(包括 0)的未知符號
#find /usr -name '*.txt' #查找/usr目錄下所有文件名以.txt結尾的文件
#find /usr -name '????' #查找/usr目錄下所有文件名剛好為4個字符的文件
#find /etc -name init
#find /etc -name *init*
#find /etc -name init???
#touch /tmp/inIt
#mkdir /tmp/Init
#find /tmp -name init
#find /tmp -iname init #不區(qū)分大小寫
#find /tmp -iname ini*
有些時候,需要在搜索時匹配某個文件或目錄的完整路徑,而不僅僅是匹配文件名??梢允褂?-path 或 -ipath 選項。
如查找
/usr
下所有文件名以.txt結尾的文件或目錄,且該文件的父目錄必須是src。可以使用以下命令:
#find /usr -path '*/src/*.txt'
-------------------------------------------------
2. 根據(jù)文件類型進行
find
檢索
如果只想搜索得到文件或目錄,即不想它們同時出現(xiàn)在結果中??梢允褂?-
type
選項指定文件類型。
-
type
選項最常用的參數(shù)如下:
f: 文件
d: 目錄
l: 符號鏈接
# find /usr -type d -name 'python*' #檢索/usr下所有文件名以python開頭的目錄
#find /etc -name init* -type f
#find /etc -name init* -a -type d
-a 兩個條件同時滿足
-o 兩個條件滿足一個即可
-------------------------------------------------
3. 根據(jù)文件大小進行
find
檢索
-size 選項允許用戶通過文件大小進行搜索(只適用于文件,目錄沒有大?。?。
表示文件大小的單位由以下字符組成:
c:字節(jié)
k:Kb
M:Mb
G:Gb
另外,還可以使用 + 或 - 符號表示大于或小于當前條件。
#find / -size +204800 #查找大于100M的文件
#find / -size -204800 #查找小于100M的文件
#find / -size 204800 #查找等于100M的文件
#find / -size +1G #檢索文件大小高于1GB的文件
#find / -size -10M #檢索文件大小小于10M的文件
204800單位是數(shù)據(jù)塊
1數(shù)據(jù)塊=512字節(jié)=0.5K
100MB = 102400KB
100MB = 2048數(shù)據(jù)塊
#find /etc -size +163840 -a -size -204800 #查找大于80M小于100M的文件
# find / -size 50M
# find / -size +50M -size -100M
# find / -size +100M -exec rm -rf {} ;
# find / -type f -name *.mp3 -size +10M -exec rm {} ;
-------------------------------------------------
4. 檢索空文件
find
命令支持 -empty 選項用來檢索為空的文件或目錄。空文件即文件里沒有任何內(nèi)容,空目錄即目錄中沒有任何文件或子目錄。
# find ~ -type d -empty #檢索用戶主目錄下所有的空目錄
-------------------------------------------------
5. 反義匹配
find
命令也允許用戶對當前的匹配條件進行
"反義"
(類似于邏輯非操作)。
如需要檢索
/usr
下所有文件名不以 .txt 為后綴的文件??梢允褂靡韵旅睿?/code>
#find /usr -type f ! -name '*.txt'
也可以
"翻轉(zhuǎn)"
任何其他的篩選條件,如:
#find /usr -type f ! -empty 檢索 /usr 下所有內(nèi)容不為空的文件
-------------------------------------------------
6. 根據(jù)文件的所屬權進行
find
檢索
#find / -type f -user starky #檢索根目錄下所有屬主為starky的文件
#find / -user root 在根目錄下查找所有者為root的文件
#find / -group root 在根目錄下查找所屬組為root的文件
# find / -user root -name tecmint.txt
# find /home -user tecmint
# find /home -group developer
# find /home -user tecmint -iname "*.txt"
-------------------------------------------------
7. 根據(jù)時間日期進行
find
檢索
修改時間(Modification
time
):最后一次文件內(nèi)容有過更改的時間點
訪問時間(Access
time
):最后一次文件有被讀取過的時間點
變更時間(Change
time
):最后一次文件有被變更過的時間點(如內(nèi)容被修改,或權限等 metadata 被修改)
與此對應的是
find
命令中的 -mtime,-atime 和 -ctime 三個選項。
這三個選項的使用遵循以下示例中的規(guī)則:
-mtime 2: 該文件 2 天前被修改過
-mtime -2:該文件 2 天以內(nèi)被修改過
-mtime +2:該文件距離上次修改已經(jīng)超過 2 天時間
#find /usr -type f -mtime 2 #檢索/usr下兩天前被修改過的文件
如果覺得 -mtime 等選項以天為單位時間有點長,還可以使用 -mmin,-amin,-cmin 三個選項:
#find /usr -type f -mtime +50 -mtime -100 #檢索/usr下50到100天之前修改過的文件
#find /usr -type f -mtime 2 -amin 5 #檢索/usr下兩天前被修改過且5分鐘前又讀取過的文件
#find /etc -amin 5 #查找5分鐘之前被訪問過的文件和目錄
#find /etc -amin -5 #查找5分鐘之內(nèi)被訪問過的文件和目錄
#find /etc -amin +5 #查找距離上次被訪問時間超過5分鐘過的文件和目錄
#find /etc -cmin 5 #查找5分鐘之前被修改過屬性的文件和目錄
#find /etc -cmin -5 #查找5分鐘之內(nèi)被修改過屬性的文件和目錄
#find /etc -cmin +5 #查找距離上次被修改過屬性超過5分鐘的文件和目錄
#find /etc -mmin 5 #查找5分鐘之前被修改過內(nèi)容的文件和目錄
#find /etc -mmin -5 #查找5分鐘之內(nèi)被修改過內(nèi)容的文件和目錄
#find /etc -mmin +5 #查找距離上次被修改過內(nèi)容超過5分鐘的文件和目錄
-------------------------------------------------
8. 根據(jù)文件權限進行
find
檢索
find
命令可以使用 -perm 選項以文件權限為依據(jù)進行搜索。
使用符號形式
如需要檢索
/usr
目錄下權限為 rwxr-xr-x 的文件,可以使用以下命令:
# find /usr -perm u=rwx,g=rx,o=rx
搜索
/usr
目錄下所有權限為 r-xr-xr-x(即系統(tǒng)中的所有用戶都只有讀寫權限)的文件和目錄,可以使用以下命令:
#find /usr -perm a=rx
很多時候,只想匹配文件權限的一個子集。比如,檢索可以直接被任何用戶執(zhí)行的文件,即只關心文件的執(zhí)行權限,而不用管其讀寫權限是什么。
上述的需求可以通過以下命令實現(xiàn):
#find / -type f -perm /a=x
其中 a=x 前面的 / 符號即用來表示只匹配權限的某個子集(執(zhí)行權限),而不用關心其他權限的具體設置。
使用數(shù)字形式
-perm 選項也支持數(shù)字形式的文件權限標記。
# find /usr -perm 644 #搜索/usr目錄下權限為 644(即 rwxr-xr-x)的文件
# find . -type f -perm 0777 -print
# find / -type f ! -perm 777
# find / -perm 2644
# find / -perm 1551
# find / -perm /u=s
# find / -perm /g+s
# find / -perm /u=r
# find / -perm /a=x
# find / -type f -perm 0777 -print -exec chmod 644 {}\;
# find / -type d -perm 777 -print -exec chmod 755 {}\;
# find . -type f -name "tecmint.txt" -exec rm -f {} \;
# find . -type f -name "*.txt" -exec rm -f {} \;
# find . -type f -name "*.mp3" -exec rm -f {} \;
# find /tmp -type f -empty
# find /tmp -type d -empty
# find /tmp -type f -name ".*"
-------------------------------------------------
9. 限制遍歷的層數(shù)(這個在上面文章已經(jīng)詳細介紹)
find
命令默認是以遞歸的方式檢索項目的,這有時候會導致得到的結果數(shù)量非常巨大??梢允褂?-maxdepth 限制
find
命令遞歸的層數(shù)。
# find / -maxdepth 3 搜索時向下遞歸的層數(shù)最大為 3
-------------------------------------------------
10. 邏輯組合
在之前的例子中有出現(xiàn)多個搜索條件的組合以及對某個搜索條件的反轉(zhuǎn)。
實際上
find
命令支持
"and"
和
"or"
兩種邏輯運算,對應的命令選項分別是 -a 和 -o。通過這兩個選項可以對搜索條件進行更復雜的組合。
此外還可以使用小括號對搜索條件進行分組。注意
find
命令中的小括號常需要用單引號包裹起來。因小括號在 Shell 中有特殊的含義。
如檢索
/usr
下文件名以 python 開頭且類型為目錄的文件
#find /usr -type d -name 'python*'
該命令等同于:
#find /usr -type d -a -name 'python*'
更復雜的組合形式如:
#find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
-------------------------------------------------
11. -
exec
command
{} \; 以及 -ok
command
{} \; 用法
#find /etc -name inittab -exec ls -l {} \; #查找inittab文件并顯示其詳細信息
在{}和\之間要有一個空格
-
exec
跟{}\; 之間執(zhí)行的是對搜索結果進行的操作動作
#find /etc -name inittab -a -type f -exec ls -l {} \;
#touch /tmp/testfile.rm
#find /tmp -name testfile.* -exec rm {} \;
-ok等同于-
exec
-ok跟{}\; 之間執(zhí)行的是對搜索結果進行的操作動作
和-
exec
不同的地方在于有一個詢問,需要輸入y或n確認
#find /etc -name init* -ok rm -l {} \;
-------------------------------------------------
12. 根據(jù)inode節(jié)點進行
find
檢索
#find /etc -inum xxx #根據(jù)I節(jié)點查找
#touch "test 000"
#ls -i
#find . -inum 396401 -exec rm {} \;
#touch test999
#ln test999 test9999
#ls -i test999
#find . -inum 396401 -exec ls -l {} \;
-------------------------------------------------
13. 對搜索結果執(zhí)行命令
1)刪除文件
-delete 選項可以用來刪除搜索到的文件和目錄。
如刪除 home 目錄下所有的空目錄:
# find ~ -type d -empty -delete
2)執(zhí)行自定義命令
-
exec
選項可以對搜索到的結果執(zhí)行特定的命令。
如需要將home目錄下所有的MP3音頻文件復制到移動存儲設備(假設路徑是
/media/MyDrive
),可使用下面的命令:
#find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
上面命令中的大括號{}作為檢索到的文件的占位符 ,而分號;作為命令結束的標志。因為分號是Shell中有特殊含義的符號,所以需要使用單引號括起來。
每當
find
命令檢索到一個符合條件的文件,會使用其完整路徑取代命令中的 {},然后執(zhí)行 -
exec
后面的命令一次。
另一個很重要的用法是,在多個文件中檢索某個指定的字符串。
如在用戶主目錄下的所有文件中檢索字符串 hello ,可以使用如下命令:
# find ~ -type f -exec grep -l hello {} ';'
-
exec
選項中的 + 符號
現(xiàn)在假設需要將用戶主目錄下所有的MP3文件添加到壓縮包 music.
tar
.gz 中,直觀的感覺是,其命令應為如下形式:
#find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
實際情況是,上面命令得到的music.
tar
.gz 其實只包含一個MP3文件。
原因是
find
命令每次發(fā)現(xiàn)一個音頻文件,都會再執(zhí)行一次-
exec
選項后面的壓縮命令。導致先前生成的壓縮包被覆蓋。
可以先讓
find
命令檢索出所有符合條件的音頻文件,再將得到的文件列表傳遞給后面的壓縮命令。所以正確完整的命令如下:
#find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
3)顯示文件信息
如果想瀏覽搜索到的文件(目錄)的詳細信息(如權限和大小等),可以直接使用-
ls
選項。
#find / -type file -size +1G -ls #瀏覽所有 1G 以上大小的文件的詳細信息
聯(lián)系客服