如何递归grep目录中的特定文件?


14

我是linux和grep的新手,并试图找到解决方法。

通过使用,find -name *.java我能够找到特定目录中所有java文件的名称。假设我要计算foo这些文件中出现的次数,我该怎么做?

我一直在尝试类似的事情:

grep -r "foo" *.java

并得到如下响应:

grep:  *.java:  No such file or directory

有任何想法吗?



1
抱歉,下次我会努力的。值得注意的是,这些问题是如此相似。
Eric Wilson

1
3512标题可能是很多更好。“基本grep使用问题”不会告诉您很多有关实际问题的信息。除非这是固定的,否则我们可能会有更多的骗子。
理查德·霍斯金斯

1
@richardhoskins,已修复。
约翰T

Answers:


16
find . -name '*.java' | xargs grep <your pattern here>

5
更好的是,请使用以null结尾的项目,以使其中带有空格的文件名不会拆分为两个文件名:find。-name'* .java'-type f -print0 | xargs -0 grep <此处为您的模式>
CoverosGene

1
@CoverosGene:您可以使用xargs的--replace选项来处理它-如下所示:... | xargs --replace grep“ {}” <pattern>
arathorn 2009年

非常感谢,我知道必须有一个执行任务的命令xargs
Eric Wilson

6

有专门针对此类需求而设计的工具:ack

ack是grep之类的工具,旨在针对拥有大量异构源代码树的程序员

另请阅读“使用ack代替grep的十大理由”。ack页面上。


1
嗯 一个真正的unix工具需要一个递归的名称,该名称要引用其遗产...例如abtg [ABTG的比Grep更好的名称]之类的东西。ACK?唯一可以想到的是,改进的NACK的作者已经选择了一个名字;)
Mikeage,2009年

我非常喜欢ack的原因之一是可以指定文件类型。例如,我使用“ ack --html <pattern>”一次搜索了所有.html,.htm,.xhtml,.dhtml等文件。
Mark van Lent

阿克已经替我取代了grep。
瑞安·汤普森

3

关于什么:

grep -irn --include="*\.java" somePhrase *

0

找 。-type f -name'* .java'-print0 | xargs -0 grep -wo'foo'| wc -l


3
欢迎来到超级用户!您会发现,当答案针对最新的问题时(此问题来自2009年),并且当您解释为什么答案比已被接受的答案更好时,您的答案会得到更多的关注。
埃里克·威尔逊
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.