Ich suche nach der Zeichenfolge foo=
in Textdateien in einem Verzeichnisbaum. Es ist auf einer gemeinsamen Linux-Maschine, ich habe Bash-Shell:
grep -ircl "foo=" *
In den Verzeichnissen befinden sich auch viele Binärdateien, die mit "foo="
. Da diese Ergebnisse nicht relevant sind und die Suche verlangsamen, möchte ich, dass grep die Suche in diesen Dateien (meist JPEG- und PNG-Bilder) überspringt. Wie würde ich das machen?
Ich weiß, es gibt die --exclude=PATTERN
y --include=PATTERN
Optionen, aber was ist das Musterformat? Die Manpage von grep sagt:
--include=PATTERN Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN Recurse in directories skip file matching PATTERN.
Suche auf grep include , grep include exclude , grep ausschließen und Varianten haben nichts Relevantes gefunden
Wenn es eine bessere Möglichkeit gibt, nur bestimmte Dateien zu durchsuchen, bin ich dafür; das Verschieben der betreffenden Dateien ist keine Option. Ich kann nicht nur bestimmte Verzeichnisse durchsuchen (die Verzeichnisstruktur ist ein großes Durcheinander, mit allem, was überall ist). Außerdem kann ich nichts installieren, so dass ich mit den üblichen Tools auskommen muss (wie grep oder die vorgeschlagene finden. ).
14 Stimmen
Nur zu Ihrer Information: die verwendeten Argumente: -c Zählen der Übereinstimmungen in der Datei -i Groß-/Kleinschreibung nicht beachten -l Nur passende Dateien anzeigen -r Rekursiv
73 Stimmen
Ein schnellerer Weg, svn-Verzeichnisse auszuschließen, ist
--exclude-dir=.svn
so dass grep gar nicht in sie hineingeht26 Stimmen
Ein paar pedantische Punkte, die man vielleicht wissen sollte: 1. Beachten Sie das Fehlen von Anführungszeichen um den glob hier: --exclude=' .{png,jpg}' funktioniert nicht (zumindest mit meiner GNU grep-Version), weil grep keine {} in seinen Globs unterstützt. Die obige Shell-Erweiterung ist '--exclude= .png --exclude=*.jpg' (unter der Annahme, dass keine Dateien im cwd übereinstimmen - was sehr unwahrscheinlich ist, da man Dateinamen normalerweise nicht mit '--exclude=' beginnt), was grep sehr gut gefällt. 2. --exclude ist eine GNU-Erweiterung und nicht Teil der POSIX-Definition von grep. Wenn Sie also Skripte schreiben, die dies verwenden, sollten Sie sich bewusst sein, dass sie nicht unbedingt auf Nicht-GNU-Systemen laufen.
2 Stimmen
Vollständiges Beispiel für die Verwendung von exclude-dir:
grep -r --exclude-dir=var "pattern" .