find 是 Linux 中最強大也最複雜的檔案搜尋工具。其語法獨特、選項繁多,但掌握核心邏輯後,能以極簡命令完成極其精準的檔案定位與批次操作。本文基於 GNU find,系統梳理語法結構、常用測試條件、動作執行與效能優化技巧。
find [起始目錄] [測試條件/選項] [匹配標準] [執行動作]
-print。find /usr /home /tmp -name "*.jar"-name "pattern":區分大小寫,支援萬用字元(需加引號或跳脫)。-iname "pattern":不區分大小寫。find . -name "*.java"、find downloads -iname "*.gif"-type d 目錄、-type f 一般檔案、-type l 符號連結、-type b/c/p/s 區塊/字元裝置/命名管道/ Socket。find . -type d 列出所有子目錄;find /usr -type l -name "z*" -ls 列出 /usr/bin 下 z 開頭連結的詳細資訊。-mtime n、-atime n、-ctime n:修改/存取/狀態改變時間(天)。-mmin n 等對應分鐘單位;-newer file 比較參考檔案時間。-size n[c/k/M/G]:檔案大小(c=bytes, k=KiB 等)。-perm mode:權限位元匹配。-user name、-group name、-uid n、-gid n:擁有者條件。-print / -print0預設輸出路徑;-print0 以 null 字元分隔,配合 xargs -0 處理含特殊字元檔名。
-exec command {} \; / -exec command {} +對每個匹配檔案執行命令;+ 結尾可批次傳遞參數,效率更高。
範例:find /usr/bin -type l -name "z*" -exec ls -l {} \;
-ls / -fls file直接輸出類似 ls -lids 格式資訊,或寫入檔案。
-ok command {} \;執行前提示確認,適合刪除等高風險操作。
find /usr /home /tmp -name "*.jar" 2>/dev/null 抑制權限錯誤訊息。
-xdev / -mount:不跨越檔案系統邊界(避免掃描 /proc、/sys、掛載的 Windows 分區等)。find / -name "*.txt" -mount 2>/dev/null-a (AND)、-o (OR)、! (NOT)、( ) 分組。find . -type f \( -name "*.c" -o -name "*.h" \) -size +10k-maxdepth n、-mindepth n 限制遞歸層數。| 需求 | 命令範例 |
|---|---|
| 找出 7 天前修改、超過 100MB 的日誌檔 | find /var/log -type f -name "*.log" -mtime +7 -size +100M |
| 刪除 30 天前的暫存檔(需確認) | find /tmp -type f -name "*.tmp" -mtime +30 -ok rm {} \; |
| 尋找擁有者為 www-data、權限 777 的檔案 | find /var/www -user www-data -perm 0777 |
| 統計專案中程式碼行數(排除 .git) | find . -type f -name "*.py" -not -path "./.git/*" -exec wc -l {} + |
{} 在 -exec 中代表當前檔案路徑,勿遺漏。-exec ... + 或 xargs,避免進程過多。-mount 並安排離峰時段。find 的威力在於「條件組合」與「動作鏈接」。熟練掌握上述核心選項,並善用 man find 查閱細節,即能應對 99% 的檔案搜尋與批次處理場景。