在專案原始碼中搜尋特定字串是開發日常。本文比較 find -exec grep、find | xargs grep、grep $(find ...) 三種常見做法的優缺點、效能差異與適用場景,並給出最佳實踐建議。
find . -type f -exec grep 'keyword' -l {} \;
-type f:僅搜尋一般檔案-exec cmd {} \;:對每個檔案單獨執行 grepgrep -l:僅輸出符合的檔案名稱grep 進程,較慢
find . -type f -name "*.*" | xargs grep 'keyword' -l
xargs 將檔案名批次傳給 grep,減少進程啟動-print0 配合 xargs -0)
grep "printf" $(find . -name "*.c")
$(...) 再執行 grepARG_MAX)導致失敗find . -type f -exec grep 'keyword' -l {} +(注意 + 結尾,批次傳遞,兼具安全與效能)find . -type f -print0 | xargs -0 grep 'keyword' -lfind . -type f -name "*.c" -exec grep 'keyword' -l {} +ripgrep (rg)、ag (the_silver_searcher)、ack 等專用工具,速度快數十倍並自動忽略 .gitignore 檔案| 參數 | 說明 |
|---|---|
grep -l | 僅列出符合檔案名 |
grep -n | 顯示行號 |
grep -i | 忽略大小寫 |
grep -r | 遞迴搜尋(單獨用 grep 即可遞迴) |
find -print0 | 以 NUL 字元分隔輸出 |
xargs -0 | 以 NUL 字元分隔讀取 |