我搜索我的代码库以查找字符串模式并列出找到该模式的所有文件,但仅列出文件而不是找到它的行:
find . -name *.java -exec grep -l 'someText' {} \; -print 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
但是,它为找到的每个文件输出两行。为什么会发生这种情况,我应该如何修改命令以列出唯一的文件名?
grep 打印文件名并返回真/假值;如果值为 True,则该-print
操作将打印文件。所以你有两种可能:
find . -name '*.java' -exec grep -l 'someText' {} \; 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
或者
find . -name '*.java' -exec grep -q 'someText' {} \; -print 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
并记得引用*.java
。否则,shell 可能会将其扩展为当前目录中的 java 文件列表。
另请注意,您不必为grep
每个文件运行一个,您最好这样做:
find . -name '*.java' -exec grep -l 'someText' {} + 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
注意2>/dev/null
会禁止的错误find
和grep
。如果你只想grep
安静,你可以改写:
find . -name '*.java' -exec grep -sl 'someText' {} +
Run Code Online (Sandbox Code Playgroud)
最后,请注意 GNU 实现grep
也可以做find
的工作:
grep -slr --include='*.java' 'someText' .
Run Code Online (Sandbox Code Playgroud)