2008-10-09 10 views

Odpowiedz

24
grep -r REGEX . 

Zastąp kod . dowolnym katalogiem, w którym chcesz wyszukać.

+1

ostrzegania, -R działa tylko z niektórymi wersjami grep. –

+3

Ponieważ pytasz o "najlepszy" sposób, myślę, że nie powinieneś zaakceptować tej odpowiedzi, ale tej, którą napisał Chas. To nie jest najlepsza odpowiedź, ponieważ '-r' nie jest przenośny. Najlepszą odpowiedzią jest ta, która jest przenośna, zajmuje się zabawnymi postaciami w nazwach plików i tworzy tylko garść procesów w najgorszym przypadku. To byłby Chas. -type f -print0 | xargs -0 grep pattern'. Całkowicie POSIX i jak kuloodporne, jak to tylko możliwe. – Jens

+3

@Jens: Ponieważ lubisz być pedantyczny, 1. 'xargs -0' nie był przenośny przez bardzo długi czas, i 2. Chas, a nie Chas (nazwiska ludzi nigdy nie są uważane za liczby mnogie). –

3

grep -r jeśli używasz GNU grep, który pochodzi z większością dystrybucji Linuksa.

Na większości UNIX-ów nie jest instalowany domyślnie więc spróbuj to zamiast:

find. -type f | xargs grep REGEX

3

Jeśli używasz powłoki zsh można użyć

grep REGEX **/* 

lub

grep REGEX **/*.java 

To może zabraknąć pary, jeśli istnieje zbyt wiele plików pasujące.

Kanoniczny sposób polega jednak na użyciu find przy użyciu exec.

find . -name '*.java' -exec grep REGEX {} \; 

lub

find . -type f -exec grep REGEX {} \; 

'Rodzaj f' bit po prostu oznacza typ pliku i będzie pasował do wszystkich plików.

7

Jest to jeden z przypadków, dla których zacząłem używając ACK (http://petdance.com/ack/) w zamian grep. Z witryny można uzyskać instrukcje instalowania jej jako komponentu Perl CPAN lub można uzyskać samodzielną wersję, którą można zainstalować bez radzenia sobie z zależnościami.

Oprócz tego, że domyślnie jest to wyszukiwanie rekursywne, pozwala używać wyrażeń regularnych Perl-strength, używa wyrażeń regularnych do wybierania plików do przeszukania itp. Ma imponującą listę opcji. Polecam odwiedzenie strony i sprawdzenie jej. Zauważyłem, że jest bardzo łatwy w użyciu i istnieją wskazówki, jak je zintegrować z vi (m), emacs, a nawet TextMate, jeśli z niego korzystasz.

2

Proponuję zmianę odpowiedź:

grep REGEX -r .

Przełącznik -r nie oznacza wyrażenie regularne. Mówi grep, aby powrócił do podanego katalogu.

+0

Umieszczenie opcji po argumentach pozycyjnych jest rozszerzeniem GNU. Niektórzy powiedzieliby, że 'grep -r' jest również rozszerzeniem GNU, ale nadal zwykle nawyk kładę wszystkie opcje przed argumentami pozycyjnymi. –

10

Sposób przenośny * robi to

find . -type f -print0 | xargs -0 grep pattern 

-print0 nakazuje znaleźć używać nuls ASCII jako separator i -0 mówi xargs samo. Jeśli ich nie użyjesz, dostaniesz błędy w plikach i katalogach zawierających spacje w swoich nazwach.

* w przeciwieństwie do grep -r, grep -R lub grep --recursive, które działają tylko na niektórych komputerach.

+0

Jak chronisz wyrażenie regularne przed powłoką? –

+0

@FelipeAlvarez Tylko cytowanie rozwiązuje większość problemu: 'grep" f. * O "'. Jedyną rzeczą, która powinna się rozwinąć w ciągu znaków, jest coś następującego po '$', więc uniknij '$' jeśli to konieczne, ale nie mogę wymyślić poprawnego wzorca dla grep, który miałby coś następującego po '$' (grep działa na liniach i '$' oznacza koniec linii). –

+0

Co dzieje się ze specjalnymi znakami powłoki Po tym, jak shell usuwa twoje cytaty, a następnie przekazuje je do xargs? Jak to wpłynie na grep po tym? –

1

Jest to świetny sposób, aby znaleźć dokładnie wyrażenie rekurencyjnie z jednym lub więcej typów plików:

find . \\(-name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep (wewnętrzne apostrofów)

Gdzie

-name '\''*.<filetype>'\'' -o (znowu pojedyncze tu cytaty)

powtarza się w nawiasach(), określając, ile innych rodzajów plików chcesz dodać do rekurencyjnego wyszukiwania.

aliasem wygląda to w bash

alias fnd='find . \\(-name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

Powiązane problemy