W dzisiejszych czasach polecam korzystanie z ag, acklub cgrepzamiast - są znacznie szybsze / lepsze niż grepdo wyszukiwania repozytoriów kodu.
lunixbochs
Jeśli przeglądasz kod i chcesz uniknąć określonych katalogów, być może powinieneś spojrzeć na ack. Jest to grep obsługujący kod źródłowy i jako taki będzie aktywnie ignorował takie katalogi VCS (a także kopie zapasowe vi i emacs, pliki inne niż źródłowe itp.).
Brian Agnew
2
W jaki sposób użytkownik może otrzymywać No such file or directorywiadomości dotyczące istniejących plików i / lub katalogów? Lub odwrotnie, jak grep *uzyskać nazwy plików, które nie istnieją? Czy jest to warunek wyścigu, w którym jakiś inny proces manipuluje drzewem katalogów (tworząc, zmieniając nazwy i usuwając pliki) podczas grepdziałania?
@Alex @Dogbert To odpowiada na pytanie, ale „-s” może maskować problemy, np. Gdy używasz xargs z grep. Spróbuj utworzyć 2 pliki w katalogu „aaa.txt” i „a b.txt”, oba zawierające ciąg „jakiś tekst”. Polecenie /bin/ls -1 | xargs grep 'some text'da ci „brak takiego pliku lub katalogu”, ponieważ dzieli „a b.txt” na 2 argumenty. Jeśli pominiesz, nie zauważysz, że przegapiłeś plik.
Kelvin
@Kelvin robi, np. Jeśli używam findi używam print0z xargs -0Czy to rozwiązuje problem? Dzięki
Luka,
1
@Luka To powinno rozwiązać problem. Nie napotkasz problemów, jeśli zawsze będziesz używać tych opcji NUL, ale jeśli tego nie zrobisz, jest prawie gwarantowane (IMHO), że zapomnisz w najbardziej nieodpowiednim momencie.
Kelvin,
działa to w systemie Mac OS X, gdzie inne opcje (--quiet) nie
philshem
59
Jeśli przeglądasz repozytorium git, polecam użyć git grep. Nie musisz przejść -Rani ścieżki.
git grep pattern
Spowoduje to wyświetlenie wszystkich dopasowań z bieżącego katalogu w dół.
+1 za przydatne polecenie specyficzne dla git. Nie zadziała jednak dla svn :-)
cadrian
2
+1 To polecenie git, którego mi brakowało - pozwala mi to na wyszukanie ciągu znaków ze stanu drzewa w dowolnym zatwierdzeniu (poprzez dodanie zatwierdzenia po „wzorcu”).
Kelvin
1
Dzięki zbiegającej się wtyczce Ggrepwyszukiwanie rozpoczyna się od początku katalogu Git zamiast bieżącego katalogu.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
Wydaje się, że jest to znacznie szybsze niż standardowe grep. (Być może ignoruje pliki binarne itp.? Nie mam pojęcia, ale jest użyteczny.)
Daniel
10
Takie błędy są zwykle wysyłane do strumienia „standardowych błędów”, który można potokować do pliku lub po prostu znikać w przypadku większości poleceń:
Odpowiada na pytanie, ale może maskować problemy. Zobacz mój komentarz pod odpowiedzią Dogberta.
Kelvin
5
Widziałem to kilka razy, z uszkodzonymi linkami (dowiązania symboliczne wskazujące na pliki, które nie istnieją), grep próbuje wyszukać plik docelowy, który nie istnieje (stąd poprawny i dokładny komunikat o błędzie).
Zwykle nie zawracam sobie głowy wykonywaniem zadań sysadmin przez konsolę, ale ze skryptów szukam plików tekstowych z „find”, a następnie grepuję:
ag
,ack
lubcgrep
zamiast - są znacznie szybsze / lepsze niżgrep
do wyszukiwania repozytoriów kodu.No such file or directory
wiadomości dotyczące istniejących plików i / lub katalogów? Lub odwrotnie, jakgrep *
uzyskać nazwy plików, które nie istnieją? Czy jest to warunek wyścigu, w którym jakiś inny proces manipuluje drzewem katalogów (tworząc, zmieniając nazwy i usuwając pliki) podczasgrep
działania?Odpowiedzi:
Możesz użyć flagi
-s
lub,--no-messages
aby ukryć błędy.źródło
/bin/ls -1 | xargs grep 'some text'
da ci „brak takiego pliku lub katalogu”, ponieważ dzieli „a b.txt” na 2 argumenty. Jeśli pominiesz, nie zauważysz, że przegapiłeś plik.find
i używamprint0
zxargs -0
Czy to rozwiązuje problem? DziękiJeśli przeglądasz repozytorium git, polecam użyć
git grep
. Nie musisz przejść-R
ani ścieżki.Spowoduje to wyświetlenie wszystkich dopasowań z bieżącego katalogu w dół.
źródło
Ggrep
wyszukiwanie rozpoczyna się od początku katalogu Git zamiast bieżącego katalogu.Takie błędy są zwykle wysyłane do strumienia „standardowych błędów”, który można potokować do pliku lub po prostu znikać w przypadku większości poleceń:
źródło
Widziałem to kilka razy, z uszkodzonymi linkami (dowiązania symboliczne wskazujące na pliki, które nie istnieją), grep próbuje wyszukać plik docelowy, który nie istnieje (stąd poprawny i dokładny komunikat o błędzie).
Zwykle nie zawracam sobie głowy wykonywaniem zadań sysadmin przez konsolę, ale ze skryptów szukam plików tekstowych z „find”, a następnie grepuję:
Zamiast:
źródło
Zwykle nie pozwalam grepowi na samą rekursję. Zazwyczaj jest kilka katalogów, które chcesz pominąć (.git, .svn ...)
Możesz tworzyć sprytne aliasy z takimi postawami:
Na pierwszy rzut oka może się to wydawać przesadne, ale gdy trzeba odfiltrować niektóre wzory, jest to całkiem przydatne.
źródło
-exec
przed swoim grepem.\( -name .svn -o -name .git \)
Czy wypróbowałeś już tę
-0
opcję w xargs ? Coś takiego:źródło
find -print0 | xargs -0 grep 'text'
Użyj
-I
w grep.Przykład:
grep SEARCH_ME -Irs ~/logs
.źródło
-I
pomija pliki binarne - jest to równoważne z--binary-files=without-match
. Nie tłumi jednak komunikatów „Brak takiego pliku lub katalogu”.Przekierowuję
stderr
na,stdout
a następnie używam grep's invert-match (-v
), aby wykluczyć ciąg ostrzeżenia / błędu, który chcę ukryć:źródło