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


12

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


感谢您提出这个问题,因此我不必这样做。现在,我只需要弄清楚如何排除“ .git”就可以了。
Dan Rosenstark 2010年

我认为js的答案更为简洁,仍然很糟糕,您必须输入--include,但是仍然如此。很可能只是写一个别名隐藏
克雷格Tataryn

Answers:


19

而且一直很受欢迎

find . -name '*.java' | xargs grep -l 'string'

编辑(作者:弗兰克·斯切尔巴)

如果要处理的文件名或目录中包含空格,则最安全的方法是:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

总是有不止一种方法来做到这一点。



11

传统的UNIX答案将是针对该问题的答案:

find . -name '*.java' | xargs grep -l 'string'

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

您真正想要的是对名称进行n分隔以使边界清楚:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

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


您还可以在xargs中使用“ --replace”选项来处理其中包含空格的文件名:... | xargs
--replace grep'string

1
find的现代版本(包括OS X上安装的版本)支持“ -exec <command> {} +”,其中末尾的加号(而不是\;)告诉find用“尽可能多的路径名替换{}”。 ...这类似于xargs(1)“的内容(来自手册页)。
道格·哈里斯

7

使用比grep,ack更好的grep :

ack -l --java  "string" 

3
默认情况下,Mac OS X上未安装ack。
约翰·托普利

我不知道“默认”是什么意思。在许多操作系统上,您选择要安装的程序,因此很难找到始终存在的程序。一次,总是有C编译器,而Perl并不常见...
bortzmeyer

1
这意味着它是标准操作系统安装的一部分。我在Mac上安装了开发人员工具,但没有安装ack。您必须自己安装它。如果有的话,这是一个不错的语法。
约翰·托普利

在ack的情况下,它是单个Perl程序,没有模块依赖性。如果可以在〜/ bin目录中“安装”程序,则可以轻松地进行“安装”确认。
安迪·莱斯特

4

如果需要的话,它实际上将使用一个正则表达式,只要远离元字符或转义它们,就可以搜索字符串。

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
这似乎是最好的答案-如果grep可以完成所有操作,为什么还要使用find&xargs?
彼得·吉布森

仅供参考,鉴于该问题的要求,该命令中的
字母

克雷格是对的,我更正了我的答案。
js。

1

由于这是一个OSX问题,因此这里是一个更特定于OSX的答案。

从命令行跳过find并使用Spotlight。功能强大得多!

命令行焦点–查找符合GREP

大多数人不知道您可以从命令行进行Spotlight搜索。为什么要记住所有奥秘的查找和grep选项,而当您可以让Spotlight为您完成工作时不记得什么呢。Spotlight的命令行界面称为mdfind。它具有与GUI Spotlight搜索相同的功能,并且更多,因为它可以在命令行中编写脚本!


0

试试看:

grep -rl "string" */*java

1
这使的“grep:* / * java的:没有这样的文件或目录”在Mac OS X
约翰·托普利

这里的问题是它只会发现* .java文件深一层。请参阅Mark Thalman针对IMHO的答案的正确方法。
路德维希·威尼泽尔

抱歉,不是我的Mac。Mac版本的grep不具有-r(递归)标志吗?
dwj

确实如此,但这就是我搜索文件中已知的字符串时得到的输出。
约翰·托普利


0
grep "(your string)" -rl $(find ./ -name "*.java")

如果要忽略大小写,请将-rl替换为-irl。(您的字符串)也可以是正则表达式,如果您发现有需要的话。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.