find:實時遍歷,功能最強
find /path -name "*.c" -type f -size +10k -mtime -7 -exec grep -l "TODO" {} +
- 優點:實時、支持極豐富條件 (名稱、類型、權限、時間、大小、正則、執行動作)。
- 缺點:大文件系統下遍歷慢、CPU/IO 佔用高。
locate:索引數據庫,秒級響應
locate "*.c" # 模糊匹配路徑locate -i "readme" # 忽略大小寫locate -c "pattern" # 僅計數locate -r "\.cpp$" # 正則匹配locate -e "pattern" # 僅輸出現存文件 (過濾已刪除)
- 原理:每日
cron 運行 updatedb 掃描全盤構建 /var/lib/mlocate/mlocate.db。 - 缺點:非實時,新建/重命名文件需手動
sudo updatedb 才可搜到。
對比總結
| 維度 | find | locate |
| 數據源 | 實時遍歷目錄樹 | 預建索引數據庫 |
| 速度 | 慢 (受文件總量影響) | 極快 (毫秒級) |
| 實時性 | 100% | 延遲 (默認 24h) |
| 查詢能力 | 極強 (組合條件、動作) | 僅路徑模式匹配 |
| 資源佔用 | 高 CPU/IO | 查詢極低,構建索引時高 |
實戰建議
- 知曉大致路徑:優先
find /known/path -name ... 縮小範圍。 - 模糊記得文件名:
locate keyword 秒級定位,再 ls -l 確認。 - 腳本/自動化:必須用
find 保證實時性。 - 手動更新索引:
sudo updatedb (或 mlocate.updatedb)。 - 替代工具:
fd (Rust):find 現代替代,彩色、智能忽略 .gitignore、並行遍歷。 rg / ag:內容搜索神器,比 grep -r 快 5-10 倍。 fzf:交互式模糊查找器,配合 find/fd/rg 實現神級體驗。
which / whereis / type 定位命令
which ls # PATH 中第一個 ls 路徑whereis ls # 二進制/源碼/手冊路徑 (數據庫)type ls # 區分 alias/builtin/外部命令, type -p 等價 which