Jak mogę Grep nie drukować błędów „Brak takiego pliku lub katalogu”?

215

Przeszukuję duży stos kodu zarządzanego przez git i za każdym razem, gdy wykonuję grep, widzę stosy i stosy wiadomości w formie:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

Czy jest jakiś sposób, aby te linie zniknęły?

Alex
źródło
1
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?
Scott

Odpowiedzi:

299

Możesz użyć flagi -slub, --no-messagesaby ukryć błędy.

-s, --no-messages pomija komunikaty o błędach

grep pattern * -s -R -n
Dogbert
źródło
14
@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ół.

Steve Prentice
źródło
5
+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ń:

grep pattern * -R -n 2>/dev/null
lunixbochs
źródło
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ę:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

Zamiast:

grep -nRHi -e "widehat" /etc
Izaak Uribe
źródło
4

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:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

Na pierwszy rzut oka może się to wydawać przesadne, ale gdy trzeba odfiltrować niektóre wzory, jest to całkiem przydatne.

Cadrian
źródło
1
+1. Jest to o wiele lepsze niż eliminowanie błędów. Myślę jednak, że zapomniałeś -execprzed swoim grepem.
Kelvin
1
Co to znaczy? \( -name .svn -o -name .git \)
sbhatla
Dlaczego nie użyć flag grep --exclude lub --exlcude-dir?
Choylton B. Higginbottom
1
@sbhatla w nawiasie utwórz kolejność operacji dla polecenia find. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom
4

Czy wypróbowałeś już tę -0opcję w xargs ? Coś takiego:

ls -r1 | xargs -0 grep 'some text'
Cokedude
źródło
2
w celu znalezienia należy dodać -print0find -print0 | xargs -0 grep 'text'
aliva,
1

Użyj -Iw grep.

Przykład: grep SEARCH_ME -Irs ~/logs.

Bala
źródło
1
-Ipomija pliki binarne - jest to równoważne z --binary-files=without-match. Nie tłumi jednak komunikatów „Brak takiego pliku lub katalogu”.
mwfearnley,
0

Przekierowuję stderrna, stdouta następnie używam grep's invert-match ( -v), aby wykluczyć ciąg ostrzeżenia / błędu, który chcę ukryć:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
talleyho
źródło