find搜尋指定名稱的檔案

find可以列出搜尋符合指定檔案名的檔案

例如要搜尋當前目錄及子目錄中檔案名稱包含 _flow的檔案,-iname是不分大小寫
find ./ -iname "*_flow*"
find -p -iname "*_flow*"
要注意有些Linux系統不能用一個以上的星號

上面的範例在打想要搜尋的檔名時寫上雙引號是要避免BASH的萬用字元問題,導致搜尋不了檔案

這問題的成因是Bash的萬用字元*具有自動展開功能,如果在當前工作目錄有符合的檔案,例如: 有over_flow和my_flow_chart,在*_flow*不加上雙引號的時候,find實際上獲得的指令會變變成find . -name over_flow my_flow_chart,導致find指令無法執行你想要的工作

搜尋指定inode號碼
find . -inum {指定的inode號碼}
檔案的inode號碼用ls -i {檔案名稱}可以查看

搜尋檔案權限為4000的檔案
find . -perm -4000

搜尋可執行檔
find . -executable -type f

修改時間超過七天的檔案
find . -type f -daystart -ctime +7
-atime {n} access時間n天內
-ctime {n} changed時間n天內
-mtime {n} modified時間n天內
-newer {file} 比某檔案還新

找屬於特定使用者或群組的檔案 
find . -user root -name *.h
find . -group root -name *.h

刪除空的目錄
find . -type d -empty -delete

刪除副檔名為.bak的檔案
find . -name "*.bak" -exec rm -f {} \;
\;是-exec結尾用的符號
怕會刪除到不正確的可以先用echo將找到的檔案路徑都印出來
find . -name "*.bak" -exec echo {} \;

結合xargs -i來刪除檔案
find . -name "*.bak" | xargs -i rm -f {}
這個指令要注意檔案和目錄名稱是否有空格或特殊字元,空格會造成rm把該檔案名稱當成兩個檔案名稱,這時後會使用-print0輸出來避免這種狀況
find . -name "*.bak" | xargs --null -i rm -f {}

刪除目前目錄下附檔名為.c、.cpp的檔案
find . -type f | grep -i ".*/.*\.\(c\|cpp\)$"  | xargs rm -r

搜尋包含"(任意數字)"檔案
find . -name "*([0-9]*)*"

搜尋檔案名稱以_開頭的檔案且修改時間比while2檔案的時間更新
find . \( -name "_*" -and -newer while2 \) -type f 
-and可以用-a簡寫,另外or是用-or或-o,而not是用-not或!

搜尋檔案包含Micro和OneCore的檔案
find . -type f \( -name "*Micro*" -and -name "*OneCore*" \)

更多find指令的使用資訊可以看GNU的find手冊說明
https://www.gnu.org/software/findutils/manual/html_mono/find.html



https://www.gomcu.com/big-5-to-utf-8/

find . -type f -name ‘*.c’ -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result ;
-exec mv {} {}.bak ;
-exec mv {}.result {} ;

find . -type f -name ‘*.h’ -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result ;
-exec mv {} {}.bak ;
-exec mv {}.result {} ;

find . -type f -name ‘*.cpp’ -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result ;
-exec mv {} {}.bak ;
-exec mv {}.result {} ;

find . -type f -name ‘*.cxx’ -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result ;
-exec mv {} {}.bak ;
-exec mv {}.result {} ;


排除特定資料夾底下的內容

結合grep過濾特定資料夾名稱
find -name *target* | grep -v '/特定目錄/'

舉例 在node.js專案下把license都搜尋出來, 不包括相依目錄下的license
$ find -iname LICENSE | grep -v node_modules/


留言