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?


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

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ół.


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

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

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.


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'

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.


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.