find — 在目錄樹中搜尋檔案

依各種條件在目錄樹中搜尋檔案與目錄。

語法

find [路徑...] [條件] [動作]

常用選項

選項 說明 範例
-name 樣式 依名稱搜尋,支援 glob(大小寫敏感) find . -name "*.log"
-iname 樣式 同 -name 但忽略大小寫 find . -iname "*.TXT"
-type 類型 依類型:f=檔案, d=目錄, l=符號連結, s=socket find . -type f
-size [+|-]n 依大小:+n 大於、-n 小於、n 等於。單位:c/k/M/G find . -size +10M
-mtime [+|-]n 依修改時間(天):-1=過去24小時, +7=7天前 find . -mtime -1
-newer 參考檔 比參考檔更新的檔案 find . -newer config.txt
-perm 模式 依權限搜尋 find . -perm 644
-user 使用者 依擁有者搜尋 find . -user root
-maxdepth n 搜尋深度最多 n 層 find . -maxdepth 2
-mindepth n 搜尋深度至少 n 層(跳過較淺的層) find . -mindepth 1
-exec cmd {} ; 對每個找到的檔案執行指令 find . -name "*.tmp" -exec rm {} \;
-exec cmd {} + 批次對所有找到的檔案執行指令(效率更高) find . -type f -exec chmod 644 {} +
-delete 刪除找到的檔案(謹慎使用) find /tmp -name "*.tmp" -delete
-ls 以 ls -dils 格式列出結果 find . -name "*.php" -ls
-print0 以 null 字元分隔輸出(搭配 xargs -0 使用) find . -name "*.txt" -print0
-empty 找出空檔案或空目錄 find . -type f -empty

使用範例

範例 1:依檔名搜尋

在當前目錄及所有子目錄中找出副檔名為 .conf 的檔案。

$ find /etc -name "*.conf"
/etc/nginx/nginx.conf
/etc/ssh/sshd_config
/etc/hosts.conf
範例 2:依類型搜尋目錄

只搜尋目錄(-type d),找出所有名為 node_modules 的目錄。

$ find ~ -type d -name "node_modules"
/home/user/projects/webapp/node_modules
/home/user/projects/api/node_modules
範例 3:搜尋指定大小以上的檔案

找出 /var/log 目錄下大於 50MB 的檔案。

$ find /var/log -type f -size +50M
/var/log/syslog.1.gz
/var/log/messages
範例 4:搜尋最近修改的檔案

找出過去 24 小時內修改過的 .py 檔案。

$ find . -name "*.py" -mtime -1
./src/main.py
./tests/test_api.py
範例 5:搜尋後執行動作(批次 chmod)

找出所有 .sh 腳本並批次賦予執行權限,使用 + 結尾效率比 \; 高。

$ find . -name "*.sh" -exec chmod +x {} +
範例 6:搜尋並刪除暫存檔

找出 /tmp 下超過 7 天未修改的 .tmp 檔案並刪除(謹慎確認路徑)。

$ find /tmp -name "*.tmp" -mtime +7 -delete
範例 7:搭配 xargs 批次處理

使用 -print0 與 xargs -0 處理檔名含空格的情況,比 -exec 更有效率。

$ find . -name "*.log" -print0 | xargs -0 grep "ERROR"
./access.log:2026-05-20 08:12:33 ERROR connection refused
./error.log:2026-05-20 09:00:01 ERROR timeout
範例 8:限制搜尋深度

只搜尋當前目錄及直接子目錄(最多 2 層深),避免太深的遞迴。

$ find . -maxdepth 2 -name "*.json"
./package.json
./src/config.json

常見錯誤與排錯

find: '/proc/12345': No such file or directory
原因
搜尋 /proc 等動態系統目錄時,程序在搜尋過程中消失。
解法
加上 2>/dev/null 將錯誤訊息重導向忽略:find /proc -name "..." 2>/dev/null
find: paths must precede expression: `*.conf`
原因
路徑參數與 glob 樣式的位置順序錯誤,忘記加引號導致 shell 展開。
解法
將 glob 樣式用引號括起來:find /etc -name "*.conf"(必須加引號)。
find: missing argument to `-exec`
原因
-exec 的指令結尾忘記加 \; 或 +。
解法
確認 -exec 的格式:-exec rm {} \; 或 -exec rm {} +。

延伸閱讀