Wie kann ich grep nicht ausdrucken lassen 'Keine solchen Datei- oder Verzeichnisfehler'?

215

Ich greife durch einen großen Stapel Code, der von git verwaltet wird, und wenn ich einen Grep mache, sehe ich Stapel und Stapel von Nachrichten des Formulars:

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

Kann ich diese Zeilen auf irgendeine Weise verschwinden lassen?

Alex
quelle
1
In diesen Tagen würde ich empfehlen , mit ag, ackoder cgrepstattdessen - sie sind viel schneller / besser als grepfür die Suche Code - Repositories.
Lunixbochs
Wenn Sie sich mit Code beschäftigen und bestimmte Verzeichnisse vermeiden möchten, sollten Sie sich vielleicht ack ansehen. Es handelt sich um ein Quellcode-fähiges Grep, das solche VCS-Verzeichnisse (sowie vi- und emacs-Sicherungen, Nicht-Quelldateien usw.) aktiv ignoriert.
Brian Agnew
2
Wie kann ein Benutzer No such file or directoryNachrichten für vorhandene Dateien und / oder Verzeichnisse erhalten? Oder umgekehrt, wie kann grep *man Namen von Dateien erhalten, die nicht existieren? Ist dies eine Race-Bedingung, bei der ein anderer Prozess den Verzeichnisbaum (Erstellen, Umbenennen und Löschen von Dateien) während der grepAusführung manipuliert ?
Scott

Antworten:

299

Sie können das Flag -soder --no-messagesverwenden, um Fehler zu unterdrücken.

-s, --no-messages unterdrücken Fehlermeldungen

grep pattern * -s -R -n
Dogbert
quelle
14
@Alex @Dogbert Dies beantwortet zwar die Frage, aber '-s' kann Probleme maskieren, z. B. wenn Sie xargs mit grep verwenden. Versuchen Sie, zwei Dateien in einem Verzeichnis zu erstellen, 'aaa.txt' und 'a b.txt', die beide die Zeichenfolge 'some text' enthalten. Der Befehl /bin/ls -1 | xargs grep 'some text'gibt Ihnen "keine solche Datei oder kein solches Verzeichnis", da er 'a b.txt' in 2 Argumente aufteilt. Wenn Sie unterdrücken, werden Sie nicht bemerken, dass Sie eine Datei verpasst haben.
Kelvin
@ Kelvin tut, zB wenn ich benutze findund benutze print0mit Löst das xargs -0das Problem? Danke
Luka
1
@Luka Das sollte das Problem lösen. Sie werden nicht auf Probleme stoßen, wenn Sie immer diese NUL-Optionen verwenden, aber wenn Sie dies nicht tun, ist es fast garantiert (IMHO), dass Sie es zum ungünstigsten Zeitpunkt vergessen werden.
Kelvin
Dies funktioniert unter Mac OS X, wo andere Optionen (--quiet) nicht
Philshem
59

Wenn Sie ein Git-Repository durchsuchen, würde ich Ihnen die Verwendung empfehlen git grep. Sie müssen nicht -Rden Pfad passieren .

git grep pattern

Daraufhin werden alle Übereinstimmungen aus Ihrem aktuellen Verzeichnis angezeigt.

Steve Prentice
quelle
5
+1 für den nützlichen git-spezifischen Befehl. Funktioniert aber nicht für SVN :-)
Cadrian
2
+1 Dies ist der git-Befehl, den ich vermisst habe. Dadurch kann ich bei jedem Commit nach einer Zeichenfolge aus dem Status des Baums suchen (indem ich das Commit nach "pattern" hinzufüge).
Kelvin
1
Mit dem flüchtigen Plugin wird Ggrepauch nach dem Anfang des Git-Verzeichnisses anstelle des aktuellen Verzeichnisses gesucht.
Ciro Santilli 法轮功 冠状 病 六四. 法轮功
Dies scheint deutlich schneller zu sein als Standard-Grep. (Vielleicht werden Binärdateien usw. ignoriert? Keine Ahnung, aber nützlich.)
Daniel
10

Solche Fehler werden normalerweise an den "Standardfehler" -Stream gesendet, den Sie an eine Datei weiterleiten oder bei den meisten Befehlen einfach verschwinden lassen können:

grep pattern * -R -n 2>/dev/null
Lunixbochs
quelle
Beantwortet die Frage, kann aber Probleme maskieren. Siehe meinen Kommentar unter Dogberts Antwort.
Kelvin
5

Ich habe gesehen, dass grep bei defekten Links (Symlinks, die auf nicht vorhandene Dateien verweisen) mehrmals versucht, nach der nicht vorhandenen Zieldatei zu suchen (daher die richtige und genaue Fehlermeldung).

Normalerweise kümmere ich mich nicht um Sysadmin-Aufgaben über die Konsole, aber in Skripten suche ich nach Textdateien mit "find" und grep dann nach jeder einzelnen:

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

Anstatt:

grep -nRHi -e "widehat" /etc
Isaac Uribe
quelle
4

Normalerweise lasse ich grep die Rekursion nicht selbst machen. Es gibt normalerweise einige Verzeichnisse, die Sie überspringen möchten (.git, .svn ...)

Mit solchen Einstellungen können Sie clevere Aliase erstellen:

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

Auf den ersten Blick mag es übertrieben erscheinen, aber wenn Sie einige Muster herausfiltern müssen, ist es ziemlich praktisch.

Cadrian
quelle
1
+1. Dies ist weitaus besser als das Unterdrücken von Fehlern. Ich denke jedoch, Sie haben das -execvor Ihrem Grep vergessen .
Kelvin
1
Was bedeutet das? \( -name .svn -o -name .git \)
sbhatla
Warum nicht die --exclude- oder --exlcude-dir-Flags von grep verwenden?
Choylton B. Higginbottom
1
@sbhatla Die Klammer erstellt eine Reihenfolge der Operationen für den Befehl find. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom
4

Haben Sie die -0Option in xargs ausprobiert ? Etwas wie das:

ls -r1 | xargs -0 grep 'some text'
Kokedude
quelle
2
Um zu finden, sollten Sie -print0find -print0 | xargs -0 grep 'text'
aliva
1

Verwenden Sie -Iin grep.

Beispiel : grep SEARCH_ME -Irs ~/logs.

Bala
quelle
1
-Iüberspringt Binärdateien - das entspricht --binary-files=without-match. Es werden jedoch keine Nachrichten "Keine solche Datei oder kein solches Verzeichnis" unterdrückt.
mwfearnley
0

Ich leite stderrzu stdoutgreps invert-match ( -v) um und verwende es dann , um die Warn- / Fehlerzeichenfolge auszuschließen, die ich ausblenden möchte:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
Talleyho
quelle