Как я могу рекурсивно grep определенных файлов в каталоге?

14

Я новичок в Linux и grep, и пытаюсь найти свой путь вокруг.

С помощью find -name *.javaя могу найти имена всех файлов Java в определенном каталоге. Предположим, я хочу посчитать, сколько раз fooвстречается в этих файлах, как бы я это сделал?

Я пробовал такие вещи, как:

grep -r "foo" *.java

и получать ответы вроде:

grep:  *.java:  No such file or directory

Есть идеи?

Эрик Уилсон
источник
1
Извините, в следующий раз я буду выглядеть сложнее. Примечательно, что вопросы были такими похожими.
Эрик Уилсон
1
Название 3512 может быть намного лучше. «Основной вопрос об использовании grep» мало что говорит о реальном вопросе. Вероятно, у нас будет больше дураков, если это не будет исправлено.
Ричард Хоскинс
1
@richardhoskins, исправлено.
Джон Т

Ответы:

16
find . -name '*.java' | xargs grep <your pattern here>
Араторна
источник
5
А еще лучше, используйте элементы с нулевым символом в конце, чтобы имя файла с пробелом в нем не разбивалось на два имени: find. -name '* .java' -type f -print0 | xargs -0 grep <ваш шаблон здесь>
CoverosGene
1
@CoverosGene: Вы можете использовать опцию --replace для xargs, чтобы справиться с этим - вот так: ... | xargs --rerep grep "{}" <pattern>
arathorn
Большое спасибо, я знал, что должна быть команда, которая делает то, что xargsделает.
Эрик Уилсон,
6

Существует инструмент, специально разработанный для этого типа потребностей: ack .

ack - это инструмент, подобный grep, предназначенный для программистов с большими деревьями разнородного исходного кода.

Также прочитайте «10 главных причин использовать ack вместо grep». на странице подтверждения .

user4126
источник
1
Мех. Настоящему инструменту Unix требуется рекурсивное имя, которое ссылается на его наследие ... например, abtg [ABTG's Better Than Grep], или что-то в этом роде. ACK? Единственная хорошая мысль об этом, что у автора улучшенного NACK уже выбрано имя;)
Mikeage
Одна из причин, по которой я действительно люблю ack, заключается в том, что вы можете указывать типы файлов. Например, я с помощью «ack --html <pattern>» просматривает все мои файлы .html, .htm, .xhtml, .dhtml и т. Д. За один раз.
Марк ван Лент
Ack в значительной степени заменил grep для меня.
Райан К. Томпсон
3

Как насчет:

grep -irn --include="*\.java" somePhrase *
Manatok
источник
0

находить . -тип f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | туалет

wudeng
источник
3
Добро пожаловать в SuperUser! Вы обнаружите, что ваши ответы привлекают больше внимания, когда речь идет о более актуальных вопросах (это вопрос 2009 года) и когда вы объясняете, почему ваш ответ лучше, чем уже принятый.
Эрик Уилсон,