Contents

Linux 指令搜尋多個檔案內容

在 Linux 上排錯時,很常遇到「我要去一堆檔案裡面找同一段字」這種需求。這時候如果只會一個一個開檔搜尋,速度會很慢。通常比較實用的做法是把 findgrep 搭起來,或直接用 grep -r

先分清楚檔名搜尋和內容搜尋

這裡最容易搞混的是:

  1. find 擅長找檔案本身。
  2. grep 擅長找檔案內容。

所以如果需求是「找出內容裡有某個字串的檔案」,通常不會只用 find,而是 find 負責篩檔案,grep 負責查內容。

標準寫法

1
find <路徑> -name "<檔案名>" -exec grep -H "<搜尋內容>" {} \;

例如:

1
find /var/log -name "*.log" -exec grep -H "error" {} \;

這表示:

  1. 先在 /var/log 找出所有 .log 檔。
  2. 對每個找到的檔案執行 grep
  3. -H 讓結果帶出檔名,方便知道是哪一個檔案命中。

另一種更常用的方式

如果你只是想遞迴搜尋某個目錄底下的內容,其實 grep -r 通常更簡潔:

1
grep -r "搜尋內容" /var/log --include="*.log"

這種寫法平常很夠用,而且可讀性也比 find -exec 高。

什麼時候用哪一個

我自己的判斷方式:

  1. 檔案條件很多,先用 find 篩比較靈活。
  2. 只是單純遞迴查內容,用 grep -r 比較快。

如果工作區有 rg 可用,很多情況甚至會直接改用 rg,速度通常更好。

常見踩雷點

1. 以為 find 本身能搜內容

find 找的是檔案屬性和路徑,不是文字內容。真正搜內容還是要靠 grep

2. 沒有限制檔案類型

如果目錄很大,沒有用 -name--include 先收斂範圍,搜尋會慢很多,還可能掃到不必要的二進位檔。

小結

Linux 搜尋多個檔案內容的核心思路很簡單:先決定是用 find 篩檔案,再交給 grep 查內容;或者直接用 grep -r 遞迴搜。把這個分工想清楚,之後遇到大量日誌、設定檔或程式碼排查時會順很多。