在 Mac OS X 上,如何在当前目录和所有子目录中搜索所有 .java 文件中的简单字符串(不是正则表达式)?我只想打印匹配的文件和目录名称的列表。
答案1
一直很受欢迎的
find . -name '*.java' | xargs grep -l 'string'
编辑(作者:弗兰克·斯泽巴):
如果您处理的文件名或目录中有空格,最安全的方法是:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
总是有多种方法可以做到。
答案2
对于这个问题,传统的 UNIX 答案是可以接受的:
find . -name '*.java' | xargs grep -l 'string'
这可能适用于 Java 文件,但文件名中的空格在 Mac 上比在传统 UNIX 世界中更常见。当带有空格的文件名通过上述管道传递时,xargs 会将各个单词解释为不同的名称。
您真正想要的是将名称用 nul 分隔,以使边界明确:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
另一种方法是让 find 为您运行 grep,正如 Mark 所建议的那样,但是如果您搜索大量文件,这种方法会更慢(因为 grep 对每个文件调用一次,而不是对整个文件列表调用一次)。
答案3
使用比 grep 更好的 grep,确认:
ack -l --java "string"
答案4
如果您愿意,这实际上将使用正则表达式,只要远离元字符,或转义它们,您就可以搜索字符串。
find . -iname "*.java" -exec egrep -il "search string" {} \;