語法
find path -option [ -print ] [ -exec -ok command ] {} \;
find 根據下列規則判斷 path 和 expression,在命令列上第一個 - ( ) , ! 之前的部份爲 path,之後的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 爲預設 expression。
expression 中可使用的選項有二三十個之多,在此只介紹最常用的部份。
-amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
-anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;
-atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;
-cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
-cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;
-daystart:從本日開始計算時間;
-depth:從指定目錄下最深層的子目錄開始查找;
-empty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;
-exec<執行指令>:假設find指令的回傳值爲True,就執行該指令;
-false:將find指令的回傳值皆設爲False;
-fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存爲指定的列表文件;
-follow:排除符號連接;
-fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;
-fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;
-fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;
-fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;
-gid<羣組識別碼>:查找符合指定之羣組識別碼的文件或目錄;
-group<羣組名稱>:查找符合指定之羣組名稱的文件或目錄;
-help或——help:在線幫助;
-ilname<範本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;
-iname<範本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;
-inum<inode編號>:查找符合指定的inode編號的文件或目錄;
-ipath<範本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;
-iregex<範本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;
-links<連接數目>:查找符合指定的硬連接數目的文件或目錄;
-iname<範本樣式>:指定字符串作爲尋找符號連接的範本樣式;
-ls:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出;
-maxdepth<目錄層級>:設置最大目錄層級;
-mindepth<目錄層級>:設置最小目錄層級;
-mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;
-mount:此參數的效果和指定“-xdev”相同;
-mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
-name<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-nogroup:找出不屬於本地主機羣組識別碼的文件或目錄;
-noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
-nouser:找出不屬於本地主機用戶識別碼的文件或目錄;
-ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;
-path<範本樣式>:指定字符串作爲尋找目錄的範本樣式;
-perm<權限數值>:查找符合指定的權限數值的文件或目錄;
-print:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲每列一個名稱,每個名稱前皆有“./”字符串;
-print0:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲全部的名稱皆在同一行;
-printf<輸出格式>:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;
-prune:不尋找字符串作爲尋找文件或目錄的範本樣式;
-regex<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:將find指令的回傳值皆設爲True;
-type<文件類型>:只尋找符合指定的文件類型的文件;
-uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;
-used<日數>:查找文件或目錄被更改之後在指定時間曾被存取過的文件或目錄,單位以日計算;
-user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;
-version或——version:顯示版本信息;
-xdev:將範圍侷限在先行的文件系統中;
-xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在於它針對符號連接檢查。
-mount, -xdev
-amin n
-anewer file
-atime n
-cmin n
-cnewer file
-ctime n
-empty
-ipath p, -path p
-name name, -iname name
-size n
d: 目錄
c: 字型裝置文件
b: 區塊裝置文件
p: 具名貯列
f: 一般文件
l: 符號連結
s: socket
-pid n
你可以使用 ( ) 將運算式分隔,並使用下列運算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
實例
find . -name "*.c"
find . -type f
find . -ctime -20
find /var/log -type f -mtime +7 -ok rm {} \;
find /var/log -type f -mtime +7 -ok rm {} \;
find . -type f -perm 644 -exec ls -l {} \;
find / -type f -size 0 -exec ls -l {} \;
find .
find /home -name "*.txt"
find /home -iname "*.txt"
find . \( -name "*.txt" -o -name "*.pdf" \)
find . -name "*.txt" -o -name "*.pdf"
find /usr/ -path "*local*"
find . -regex ".*\(\.txt\|\.pdf\)$"
find . -iregex ".*\(\.txt\|\.pdf\)$"
find /home ! -name "*.txt"
find . -type 類型參數
f 普通文件
l 符號連接
d 目錄
c 字符設備
b 塊設備
s 套接字
p Fifo
基於目錄深度搜索
find . -maxdepth 3 -type f
find . -mindepth 2 -type f
find . -type f 時間戳
UNIX/Linux文件系統每個文件都有三種時間戳:
訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。
修改時間(-mtime/天,-mmin/分鐘):文件最後一次修改時間。
變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。
find . -type f -atime -7
find . -type f -atime 7
find . -type f -atime +7
find . -type f -amin +10
find . -type f -newer file.log
find . -type f -size 文件大小單元
文件大小單元:
b —— 塊(512字節)
c —— 字節
w —— 字(2字節)
k —— 千字節
M —— 兆字節
G —— 吉字節
find . -type f -size +10k
find . -type f -size -10k
find . -type f -size 10k
find . -type f -name "*.txt" -delete
find . -type f -perm 777
find . -type f -name "*.php" ! -perm 644
find . -type f -user tom
find . -type f -group sunk
find .-type f -user root -exec chown tom {} \;
上例中,{} 用於與-exec選項結合使用來匹配所有文件,然後會被替換爲相應的文件名。
find $HOME/. -name "*.txt" -ok rm {} \;
上例中,-ok和-exec行爲一樣,不過它會給出提示,是否執行相應的操作。
find . -type f -name "*.txt" -exec cat {} \;> all.txt
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
-exec ./text.sh {} \;
搜索但跳出指定的目錄
find . -path "./sk" -prune -o -name "*.txt" -print
find其他技巧收集
find . -empty