grep 特定字符串目录中的所有 .java 文件

Joh*_*ley 12 mac unix grep macos

我将如何在当前目录和 Mac OS X 上的所有子目录中搜索所有 .java 文件中的简单字符串(不是正则表达式)?我只想打印匹配的文件和目录名称的列表。

Dav*_*osh 19

而且一直很受欢迎

find . -name '*.java' | xargs grep -l 'string'
Run Code Online (Sandbox Code Playgroud)

编辑(由弗兰克 Szczerba):

如果您正在处理包含空格的文件名或目录,最安全的方法是:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'
Run Code Online (Sandbox Code Playgroud)

总是有不止一种方法可以做到。


小智 11

传统的 UNIX 答案将是这个问题所接受的答案:

find . -name '*.java' | xargs grep -l 'string'
Run Code Online (Sandbox Code Playgroud)

这可能适用于 Java 文件,但文件名中的空格在 Mac 上比在传统 UNIX 世界中更常见。当带有空格的文件名通过上面的管道时,xargs 会将单个单词解释为不同的名称。

您真正想要的是对名称进行空分隔以使边界明确:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'
Run Code Online (Sandbox Code Playgroud)

另一种方法是让 find 为您运行 grep,正如 Mark 建议的那样,但如果您正在搜索大量文件,这种方法会较慢(因为 grep 对每个文件调用一次,而不是对整个文件列表调用一次)。


bor*_*yer 8

使用比 grep, ack更好的 grep :

ack -l --java  "string" 
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,Mac OS X 上未安装 ack。 (3认同)

js.*_*js. 6

grep -rl --include="*.java" simplestring *
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是这里最好的答案 - 如果 grep 完成了这一切,为什么要使用 find & xargs? (2认同)