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

9494
Eric Wilson

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

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

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

grep -r "foo" *.java 

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

grep: *.java: No such file or directory 

Есть идеи?

13
Dupe: http://superuser.com/questions/3512/ innaM 14 лет назад 2
Извините, в следующий раз я буду выглядеть сложнее. Примечательно, что вопросы были такими похожими. Eric Wilson 14 лет назад 0
Название 3512 может быть намного лучше. «Основной вопрос об использовании grep» мало что говорит о реальном вопросе. У нас, вероятно, будет больше дуплей, если это не будет исправлено. Richard Hoskins 14 лет назад 0
@richardhoskins, исправлено. John T 14 лет назад 0

4 ответа на вопрос

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

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

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

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

Мех. Настоящему инструменту Unix требуется рекурсивное имя, которое ссылается на его наследие ... например, abtg [ABTG's Better Than Grep], или что-то в этом роде. ACK? Единственная хорошая мысль об этом, что у автора улучшенного NACK уже выбрано имя;) Mikeage 14 лет назад 1
Одна из причин, по которой я действительно люблю ack, заключается в том, что вы можете указывать типы файлов. Например, я с "ack --html"он ищет все мои файлы .html, .htm, .xhtml, .dhtml и т. д. за один раз. Mark van Lent 14 лет назад 0
Ack в значительной степени заменил grep для меня. Ryan Thompson 14 лет назад 0
3
Manatok

Как насчет:

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

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

Добро пожаловать в SuperUser! Вы обнаружите, что ваши ответы привлекают больше внимания, когда речь идет о более актуальных вопросах (это вопрос 2009 года) и когда вы объясняете, почему ваш ответ лучше, чем уже принятый. Eric Wilson 11 лет назад 3
@EricWilson спасибо за совет :) wudeng 11 лет назад 0

Похожие вопросы