grep wszystkie pliki .java w katalogu dla określonego ciągu

12

Jak przeszukać wszystkie pliki .java w poszukiwaniu prostego ciągu (nie wyrażenia regularnego) w bieżącym katalogu i wszystkich podkatalogach w systemie Mac OS X? Chcę tylko wydrukować listę pasujących nazw plików i katalogów.

John Topley
źródło
Dzięki, że o to pytasz, więc nie muszę. Teraz muszę tylko wymyślić, jak wykluczyć „.git” i mam już dość.
Dan Rosenstark
Myślę, że odpowiedź js jest bardziej zwięzła, wciąż jest do bani, że musisz wpisać - w tym, ale nadal. Prawdopodobnie mógłby po prostu napisać alias, aby to ukryć
Craig Tataryn

Odpowiedzi:

19

I zawsze popularny

find . -name '*.java' | xargs grep -l 'string'

EDYCJA (autor: Frank Szczerba):

Jeśli masz do czynienia z nazwami plików lub katalogami, w których są spacje, najbezpieczniejszym sposobem na to jest:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Zawsze jest na to więcej niż jeden sposób.

David Mackintosh
źródło
11

Tradycyjna odpowiedź dla systemu UNIX byłaby odpowiedzią na to pytanie:

find . -name '*.java' | xargs grep -l 'string'

Prawdopodobnie będzie to działać w przypadku plików Java, ale spacje w nazwach plików są o wiele bardziej powszechne na komputerach Mac niż w tradycyjnym świecie UNIX. Kiedy nazwy plików ze spacjami są przekazywane przez powyższy potok, xargs zinterpretuje poszczególne słowa jako różne nazwy.

To, czego naprawdę chcesz, to rozdzielenie nazw, aby granice były jednoznaczne:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Alternatywą jest umożliwienie znalezienia uruchomienia grep, jak sugeruje Mark, jednak takie podejście jest wolniejsze, jeśli przeszukujesz dużą liczbę plików (ponieważ grep jest wywoływany raz na plik, a nie raz na całej liście plików).

Frank Szczerba
źródło
Możesz także użyć opcji „--replace” w xargs, aby radzić sobie z nazwami plików, w których są spacje: ... | xargs --replace grep 'string' '{}' ({} zostanie zastąpiony nazwą pliku)
arathorn
1
Nowoczesne wersje find (w tym ta zainstalowana w systemie OS X) obsługują „-exec <command> {} +”, gdzie znak plus na końcu (zamiast \;) mówi find, aby zastąpić {} „możliwie jak największą liczbą ścieżek ... Jest podobny do xargs (1) "(ze strony podręcznika).
Doug Harris,
7

Użyj grepa, który jest lepszy niż grep, ack :

ack -l --java  "string" 
bortzmeyer
źródło
3
ack nie jest domyślnie zainstalowany w systemie Mac OS X.
John Topley,
Nie wiem, co znaczy „domyślnie”. W wielu systemach operacyjnych wybierasz to, co instalujesz, więc trudno jest znaleźć programy, które są zawsze obecne. W tym czasie kompilator C zawsze tam był, a Perl był rzadki ...
bortzmeyer
1
Oznacza to, że jest to część standardowej instalacji systemu operacyjnego. Mam zainstalowane narzędzia programistyczne na komputerze Mac i nie instalują potwierdzenia. Musisz go zainstalować samodzielnie. Jeśli tak, to niezła składnia.
John Topley,
W przypadku potwierdzenia jest to pojedynczy program Perla bez zależności modułów. Jeśli możesz „zainstalować” programy w katalogu ~ / bin, możesz równie łatwo „zainstalować” potwierdzenie.
Andy Lester
4

To faktycznie użyje wyrażenia regularnego, jeśli chcesz, po prostu trzymaj się z dala od metaznaków lub uciec od nich, i możesz szukać ciągów.

find . -iname "*.java" -exec egrep -il "search string" {} \;

Mark Thalman
źródło
3
grep -rl --include="*.java" simplestring *
js.
źródło
1
To wydaje się być najlepszą odpowiedzią tutaj - jeśli grep to wszystko, po co używać find & xargs?
Peter Gibson,
Do Twojej wiadomości, biorąc pod uwagę pytanie, powinno być małe „l”, nie duże „L” w tym poleceniu
Craig Tataryn
Craig ma rację, poprawiłem swoją odpowiedź.
js.
1

Ponieważ jest to pytanie OSX, oto bardziej szczegółowa odpowiedź na OSX.

Pomiń findi użyj Spotlightz wiersza poleceń. O wiele potężniejszy!

ŚWIATŁO POLECENIA - ZNAJDŹ SPOTKANIE GREP

Większość ludzi nie wie, że możesz wyszukiwać Spotlight z wiersza poleceń. Po co zapamiętywać wszystkie tajemne opcje wyszukiwania i grep, a co nie, kiedy Spotlight może wykonać pracę za Ciebie. Interfejs wiersza poleceń do Spotlight nazywa się mdfind. Ma tę samą moc, co wyszukiwanie Spotlight w GUI i więcej, ponieważ jest skryptowalny w wierszu poleceń!


źródło
0

Spróbuj tego:

grep -rl "string" */*java
dwj
źródło
1
To daje "grep: * / * Java: Nie ma takiego pliku lub katalogu" na Mac OS X.
John Topley
Problem polega na tym, że znajdzie pliki * .java tylko jeden poziom głębokości. Zobacz odpowiedź Marka Thalmana na IMHO, w jaki sposób to zrobić.
Ludwig Weinzierl
Przepraszam, nie na moim Macu. Czy grep na Macu nie ma flagi -r (rekurencyjnej)?
dwj
Tak, ale to był wynik, który uzyskałem podczas wyszukiwania łańcucha, który, jak wiem, znajduje się w plikach.
John Topley,
0

Możesz także użyć programu GUI, takiego jak TextWrangler, aby przeprowadzić bardziej intuicyjne wyszukiwanie, gdzie opcje znajdują się w interfejsie.

Mark Thalman
źródło
0
grep "(your string)" -rl $(find ./ -name "*.java")

Jeśli chcesz zignorować wielkość liter, zamień -rl na -irl. (Twój ciąg) może być również wyrażeniem regularnym, jeśli kiedykolwiek zobaczysz taką potrzebę.

śmiech
źródło