Jak rekurencyjnie grepować określone pliki w katalogu?

14

Jestem nowy w Linuksie i Grep i próbuję znaleźć własną drogę.

Korzystając z niego find -name *.java, jestem w stanie znaleźć nazwy wszystkich plików Java w określonym katalogu. Załóżmy, że chcę policzyć, ile razy foowystępuje w tych plikach, jak mam to zrobić?

Próbuję takich rzeczy jak:

grep -r "foo" *.java

i uzyskiwanie odpowiedzi takich jak:

grep:  *.java:  No such file or directory

Jakieś pomysły?

Eric Wilson
źródło
1
Przepraszam, następnym razem będę wyglądał mocniej. Zadziwiające, że pytania były tak podobne.
Eric Wilson,
1
Tytuł 3512 mógłby być znacznie lepszy. „Podstawowe pytanie o użytkowanie grep” nie mówi wiele o rzeczywistym pytaniu. Prawdopodobnie będziemy mieli więcej duplikatów, chyba że zostanie to naprawione.
Richard Hoskins,
1
@richardhoskins, naprawiono.
John T

Odpowiedzi:

16
find . -name '*.java' | xargs grep <your pattern here>
arathorn
źródło
5
Co więcej, używaj elementów zakończonych znakiem zerowym, aby nazwa pliku ze spacją nie została podzielona na dwie nazwy plików: znajdź. -nazwa „* .java” -typ f -print0 | xargs -0 grep <twój wzór tutaj>
CoverosGene
1
@CoverosGene: Możesz użyć opcji --replace, aby poradzić sobie z tym - tak: ... | xargs --replace grep "{}" <pattern>
arathorn
dzięki wielkie, wiedziałem, że musi istnieć polecenie, które robi to, co xargsrobi.
Eric Wilson,
6

Istnieje narzędzie zaprojektowane specjalnie do tego rodzaju potrzeb: ack .

ack jest narzędziem podobnym do grep, przeznaczonym dla programistów z dużymi drzewami heterogenicznego kodu źródłowego

Przeczytaj także „10 najważniejszych powodów, dla których warto używać ack zamiast grep”. na ack stronie.

użytkownik4126
źródło
1
Meh Prawdziwe narzędzie uniksowe potrzebuje rekurencyjnej nazwy odwołującej się do jego dziedzictwa ... jak abtg [ABTG's Better Than Grep] lub coś takiego. ACK? Jedyną dobrą myślą na ten temat jest to, że autor ulepszonego NACK ma już wybraną nazwę;)
Mikeage,
Jednym z powodów, dla których naprawdę uwielbiam potwierdzenie, jest to, że możesz określić typy plików. Na przykład ja za pomocą „ack --html <pattern>” przeszukuje wszystkie moje pliki .html, .htm, .xhtml, .dhtml itp. Za jednym razem.
Mark van Lent
Ack prawie dla mnie zastąpił grep.
Ryan C. Thompson,
3

Co powiesz na:

grep -irn --include="*\.java" somePhrase *
Manatok
źródło
0

odnaleźć . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l

wudeng
źródło
3
Witamy w SuperUser! Przekonasz się, że twoje odpowiedzi zwracają większą uwagę na bardziej aktualne pytania (to z 2009 roku) i kiedy wyjaśnisz, dlaczego twoja odpowiedź jest lepsza niż już zaakceptowana.
Eric Wilson,