find/grep 为它找到匹配的每个文件输出两行

amp*_*ent 3 grep find

我搜索我的代码库以查找字符串模式并列出找到该模式的所有文件,但仅列出文件而不是找到它的行:

find . -name *.java -exec grep -l 'someText' {} \; -print 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

但是,它为找到的每个文件输出两行。为什么会发生这种情况,我应该如何修改命令以列出唯一的文件名?

JPG*_*JPG 6

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会禁止的错误findgrep。如果你只想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)