Как я могу рекурсивно 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». на странице подтверждения .


1
Мех. Настоящему инструменту Unix требуется рекурсивное имя, которое ссылается на его наследие ... например, abtg [ABTG's Better Than Grep], или что-то в этом роде. ACK? Единственная хорошая мысль об этом, что у автора улучшенного NACK уже выбрано имя;)
Mikeage

Одна из причин, по которой я действительно люблю ack, заключается в том, что вы можете указывать типы файлов. Например, я с помощью «ack --html <pattern>» просматривает все мои файлы .html, .htm, .xhtml, .dhtml и т. Д. За один раз.
Марк ван Лент

Ack в значительной степени заменил grep для меня.
Райан К. Томпсон


0

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


3
Добро пожаловать в SuperUser! Вы обнаружите, что ваши ответы привлекают больше внимания, когда речь идет о более актуальных вопросах (это вопрос 2009 года) и когда вы объясняете, почему ваш ответ лучше, чем уже принятый.
Эрик Уилсон,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.