前言
在 Linux 系統管理與開發日常中,find 與 grep 是最核心的檔案搜尋與內容過濾工具組合。本文系統整理兩者常用參數、組合技巧與正則表達式應用,助你高效定位目標檔案與內容。
一、find 指令核心用法
1. 基礎搜尋語法
find [搜尋路徑] [選項] [搜尋條件] [執行動作]
2. 常用搜尋維度與範例
| 搜尋目標 | 指令範例 | 說明 |
| 檔名 | find / -name "httpd.conf" | 從根目錄遞歸搜尋完全匹配檔名 |
| 檔名模糊 | find . -name "*.log" | 當前目錄下搜尋所有 .log 結尾檔案 |
| 檔案內容 | find . -name "*.*" | xargs grep 'keyword' | 配合 grep 搜尋檔案內含關鍵字的檔案 |
| 多條件 | find . \( -name "*.txt" -o -name "*.pdf" \) -print | 搜尋 .txt 或 .pdf 檔案,括號需轉義 |
3. 進階過濾參數速查
| 參數 | 功能 | 範例 |
-type f/d/l | 檔案類型:普通檔/目錄/符號連結 | find / -type f -name "*.conf" |
-size +100M | 檔案大小大於 100MB | find /var/log -size +100M |
-mtime -7 | 7 天內修改過的檔案 | find /home -mtime -7 |
-user username | 屬於指定用戶 | find / -user nginx |
-maxdepth 3 | 限制遞歸深度 | find . -maxdepth 2 -name "*.py" |
-delete | 直接刪除匹配檔案(慎用) | find /tmp -name "*.tmp" -delete |
二、grep 指令核心用法
1. 基礎語法
grep [選項] '搜尋模式' [檔案...]
2. 常用參數速查
| 參數 | 功能 | 範例 |
-i | 忽略大小寫 | grep -i "error" /var/log/syslog |
-n | 顯示行號 | grep -n "TODO" *.c |
-v | 反向匹配(顯示不含模式的行) | grep -v "^#" config.ini |
-r | 遞歸搜尋目錄 | grep -r "function" src/ |
-c | 僅統計匹配行數 | grep -c "ERROR" app.log |
-A 2 -B 2 | 顯示匹配行前後各 2 行 | grep -A 2 -B 2 "exception" log.txt |
-l | 僅列出匹配的檔案名 | grep -rl "API_KEY" . |
-E | 使用擴展正則表達式 | grep -E "(error|warn|fail)" log.txt |
3. 正則表達式元字元速查
| 符號 | 含義 | 範例 |
^ | 行首錨定 | ^ERROR 匹配以 ERROR 開頭的行 |
$ | 行尾錨定 | failed$ 匹配以 failed 結尾的行 |
. | 任意單一字元(除換行) | gr.p 匹配 grep、grip 等 |
* | 前一字元 0 次或多次 | ab*c 匹配 ac、abc、abbc... |
[] | 字元集合 | [Gg]rep 匹配 Grep 或 grep |
[^] | 排除字元集合 | [^0-9] 匹配非數字字元 |
\{m,n\} | 前一字元出現 m 到 n 次 | 0\{3,5\} 匹配 3~5 個 0 |
\b | 單詞邊界 | \broot\b 僅匹配完整單詞 root |
三、黃金組合實戰場景
場景 1:尋找包含特定錯誤碼的近期日誌檔
find /var/log -name "*.log" -mtime -3 | xargs grep -n "500 Internal Server Error"
場景 2:清理專案中所有編譯產物
find . -type f \( -name "*.o" -o -name "*.obj" -o -name "*.exe" \) -delete
場景 3:搜尋含有 TODO/FIXME 註釋的原始碼並顯示上下文
grep -rn -A 2 -B 2 "TODO\|FIXME" src/ --include="*.c" --include="*.h"
場景 4:統計專案中各類檔案行數
find . -type f -name "*.[ch]" | xargs wc -l
四、效能優化建議
- 優先使用
-maxdepth 限制搜尋深度,避免掃描無關目錄(如 /proc、/sys)。
- 大量檔案配合
xargs 而非管道直接傳給 grep,減少進程啟動開銷:find ... -print0 | xargs -0 grep ...。
- 固定字串搜尋加
-F(fgrep),禁用正則引擎提升速度。
- 使用
--include/--exclude 縮小 grep 掃描範圍。
總結
find 負責「在哪裡找」,grep 負責「找什麼內容」。熟練掌握兩者參數與正則表達式,配合管道與 xargs,能解決 90% 以上的檔案與內容檢索需求。建議收藏本文速查表,實戰中靈活組合。