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?



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>

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.


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,


0

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.