找檔案是 Linux 運維的高頻動作。find 走檔案系統、即時精準;locate 查資料庫、秒級模糊。本文系統整理兩者語法、常用參數、組合招與效能取捨,助你精準定位任何檔案。
一、find:即時、精準、可執行動作
基本語法
find [路徑] [運算式] [動作]
# 範例:找 /var/log 下 7 天前、超過 100M 的 .log 檔並刪除
find /var/log -type f -name "*.log" -mtime +7 -size +100M -exec rm -f {} \;
核心測試條件(Test)
| 參數 | 說明 | 範例 |
-name pattern | 檔名匹配(支援萬用字元) | -name "*.conf" |
-iname pattern | 忽略大小寫 | -iname "readme*" |
-type f/d/l/c/b/p/s | 檔案類型:普通/目錄/連結/字元/區塊/管道/socket | -type f |
-size n[c/k/M/G] | 大小:+n 大於、-n 小於、n 等於 | -size +100M |
-mtime -n/+n | 修改時間:n 天內 / n 天前 | -mtime -7 |
-atime / -ctime | 存取時間 / 狀態改變時間 | -atime +30 |
-user / -group | 擁有者 / 群組 | -user nginx |
-perm mode | 權限匹配 | -perm -u=x(擁有者可執行) |
-nouser / -nogroup | 無對應帳號/群組 | 清理孤兒檔案 |
-newer file | 比參考檔新 | -newer /etc/passwd |
-path / -ipath | 路徑匹配 | -path "*/.git/*" |
-prune | 排除目錄(需配合 -o) | -path "./node_modules" -prune -o -print |
動作
| 參數 | 說明 |
-print | 預設,列印路徑 |
-ls | 類似 ls -dils 詳細資訊 |
-exec cmd {} \; | 對每個結果執行 cmd({} 為路徑,\; 結尾) |
-exec cmd {} + | 批次執行(較快,參數列長度有限制) |
-ok cmd {} \; | 執行前互動確認 |
-printf format | 自訂輸出格式(%p %s %TY-%Tm-%Td %TH:%TM) |
-delete | 直接刪除(隱含 -depth,慎用) |
實戰組合招
# 1. 找出佔用空間前 10 大檔案
find / -type f -size +100M -printf "%s %p\n" 2>/dev/null | sort -rn | head -10
# 2. 清理 30 天前的暫存檔(排除 /proc /sys)
find / -type f \( -path /proc -o -path /sys \) -prune -o -atime +30 -name "*.tmp" -print -delete
# 3. 找出含特定字串的檔案(配合 grep)
find /opt/app -type f -name "*.java" -exec grep -l "TODO" {} +
# 4. 修正權限:目錄 755、檔案 644
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
# 5. 找出斷開的符號連結
find / -xtype l -ls 2>/dev/null
二、locate:秒級模糊搜尋
原理
讀取 /var/lib/mlocate/mlocate.db(每日 cron.daily/mlocate 更新),不走磁碟,極快。
常用參數
| 參數 | 說明 |
-i | 忽略大小寫 |
-r regex | 正則匹配 |
-c | 只顯示計數 |
-e | 只顯示現存檔案(需掃描檢查,較慢) |
-S | 顯示資料庫統計 |
範例
locate -i nginx.conf # 快速定位設定檔
locate -r '^.*\.pyc$' # 找所有 .pyc
locate -c passwd # 計數
updatedb # 手動更新資料庫(新建檔案後立即可搜)
三、選擇指南:find vs locate
| 場景 | 推薦工具 | 理由 |
| 剛建立的檔案 | find | locate 資料庫尚未更新 |
需按時間/大小/權限/類型過濾 | find | locate 無此類測試條件 |
需對結果執行動作(刪/改/壓) | find | locate 僅查詢 |
只記得檔名關鍵字,要秒出結果 | locate | 全盤掃描太慢 |
找斷連結、孤兒檔、特殊類型 | find | locate 不支援 |
四、進階替代者:fd / fzf / ripgrep
- fd:Rust 寫入,語法更簡潔(
fd pattern),預設忽略 .gitignore、.hidden,彩色輸出,速度介於 find/locate 之間
- fzf:模糊互動式搜尋器,配合
find/fd 管線,體驗極佳
- ripgrep (rg):內容搜尋王者,
rg "pattern" 替代 grep -r,支援 .gitignore、多執行緒、PCRE2
結語: find 是瑞士刀,功能最全、可自動化處理;locate 是手電筒,找東西最快;現代工具 fd/rg/fzf 則是強化版手電筒+瑞士刀。建議:日常搜尋用 locate/fd,腳本自動化、複雜條件、需執行動作時上 find。