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.
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:
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:
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).
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).
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.
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ń!
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ę.
Odpowiedzi:
I zawsze popularny
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:
Zawsze jest na to więcej niż jeden sposób.
źródło
mdfind
to bardziej OSXy sposób na zrobienie tego !Tradycyjna odpowiedź dla systemu UNIX byłaby odpowiedzią na to pytanie:
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:
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).
źródło
Użyj grepa, który jest lepszy niż grep, ack :
źródło
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.
źródło
źródło
Ponieważ jest to pytanie OSX, oto bardziej szczegółowa odpowiedź na OSX.
Pomiń
find
i użyjSpotlight
z wiersza poleceń. O wiele potężniejszy!ŚWIATŁO POLECENIA - ZNAJDŹ SPOTKANIE GREP
źródło
Spróbuj tego:
źródło
Możesz także użyć programu GUI, takiego jak TextWrangler, aby przeprowadzić bardziej intuicyjne wyszukiwanie, gdzie opcje znajdują się w interfejsie.
źródło
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ę.
źródło