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?
ag
,ack
odercgrep
stattdessen - sie sind viel schneller / besser alsgrep
für die Suche Code - Repositories.No such file or directory
Nachrichten für vorhandene Dateien und / oder Verzeichnisse erhalten? Oder umgekehrt, wie kanngrep *
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 dergrep
Ausführung manipuliert ?Antworten:
Sie können das Flag
-s
oder--no-messages
verwenden, um Fehler zu unterdrücken.quelle
/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.find
und benutzeprint0
mit Löst dasxargs -0
das Problem? DankeWenn Sie ein Git-Repository durchsuchen, würde ich Ihnen die Verwendung empfehlen
git grep
. Sie müssen nicht-R
den Pfad passieren .Daraufhin werden alle Übereinstimmungen aus Ihrem aktuellen Verzeichnis angezeigt.
quelle
Ggrep
auch nach dem Anfang des Git-Verzeichnisses anstelle des aktuellen Verzeichnisses gesucht.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:
quelle
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:
Anstatt:
quelle
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:
Auf den ersten Blick mag es übertrieben erscheinen, aber wenn Sie einige Muster herausfiltern müssen, ist es ziemlich praktisch.
quelle
-exec
vor Ihrem Grep vergessen .\( -name .svn -o -name .git \)
Haben Sie die
-0
Option in xargs ausprobiert ? Etwas wie das:quelle
find -print0 | xargs -0 grep 'text'
Verwenden Sie
-I
in grep.Beispiel :
grep SEARCH_ME -Irs ~/logs
.quelle
-I
überspringt Binärdateien - das entspricht--binary-files=without-match
. Es werden jedoch keine Nachrichten "Keine solche Datei oder kein solches Verzeichnis" unterdrückt.Ich leite
stderr
zustdout
greps invert-match (-v
) um und verwende es dann , um die Warn- / Fehlerzeichenfolge auszuschließen, die ich ausblenden möchte:quelle