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 {} +。