Linux
在 LInux 中搜尋多個文件以查找字元串
如何搜尋文件,其中一些可能是給定字元串的目錄(在這種情況下是遞歸的)?
我想在源文件中搜尋一個類定義,所以如果在每個輸出字元串之前有包含文件的名稱也會很好。
你可以使用 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