Linux

在 LInux 中搜尋多個文件以查找字元串

  • June 11, 2020

如何搜尋文件,其中一些可能是給定字元串的目錄(在這種情況下是遞歸的)?

我想在源文件中搜尋一個類定義,所以如果在每個輸出字元串之前有包含文件的名稱也會很好。

你可以使用 grep:

grep -rn 'classname' /path/to/source

這還將在每個匹配項旁邊列印行號。

不區分大小寫:

grep -rin 'classname' /path/to/source

在所有 cpp 文件中進行非遞歸搜尋:

grep -n 'classname' /path/to/source/*.cpp

以上所有答案都可以很好地工作,但如果您的字元串不僅僅是原始碼,則可能會導致誤報。假設您正在尋找在 java 項目中使用 FooBar 類的位置,您可以搜尋所有名為 *.java 的文件,然後用 grep 搜尋這些文件。

# grep "FooBar" -Hn $(find -name "*.java")

$() 之間的部分將擴展為該命令的輸出。-H 列印出文件名。有多個文件名是預設設置,但我們在此處顯式添加它,以防擴展只返回一個文件名。-n 列印匹配的行號。

這適用於小型項目,但如果您正在處理較大的項目,則查找可能會擴展到比命令行限制更長的字元串。因此使用更安全:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs 將從標準輸入中獲取輸入並將其拆分為適合命令行,必要時多次執行該命令。-print0 和 -0 是處理名稱中帶有空格的文件所必需的。

您還可以使用以下方法查找所有匹配的文件名:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

-l 將只顯示文件名並在找到匹配項後立即停止查找特定文件。

如果你要經常做這類事情,你可能想看看像 ctags 或 exuberant tags 這樣的工具,它們維護你的原始碼的搜尋索引並且可以快速回答這類問題。vim 和 emacs 都支持這些工具。你可能還想看看像eclipse這樣的IDE,它可以很好地進行交叉引用。

(我知道您正在尋找一個類定義,但在 Java 中,一個類將在與該類同名的文件中定義。如果您正在執行 cpp,您可以執行以下操作:

# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
 xargs -0 egrep "class\s+FooBar" -Hn 

引用自:https://serverfault.com/questions/33158