926 Stimmen

Verwenden Sie die Syntax grep --exclude/--include, um bestimmte Dateien nicht zu durchsuchen

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 hineingeht

26 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.

13voto

Der vorgeschlagene Befehl:

grep -Ir --exclude="*\.svn*" "pattern" *

ist konzeptionell falsch, da --exclude mit dem Basisnamen arbeitet. Mit anderen Worten, es werden nur die .svn im aktuellen Verzeichnis übersprungen.

11voto

deric Punkte 172

In grep 2.5.1 müssen Sie diese Zeile zum ~/.bashrc- oder ~/.bash-Profil hinzufügen

export GREP_OPTIONS="--exclude=\*.svn\*"

8voto

Aaron Maenpaa Punkte 112919

Ich finde die Ausgabe von grep manchmal sehr hilfreich:

grep -rn "foo=" . | grep -v "Binary file"

Das hindert ihn jedoch nicht daran, die Binärdateien zu durchsuchen.

7voto

aesede Punkte 5313

Unter CentOS 6.6/Grep 2.6.3 muss ich es wie folgt verwenden:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

Beachten Sie das Fehlen der Gleichheitszeichen "=" (sonst --include , --exclude , include-dir y --exclude-dir werden ignoriert)

7voto

OnlineCop Punkte 3909

Wenn Sie nicht abgeneigt sind, die find Ich mag seine -prune Funktion:

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME

In der ersten Zeile geben Sie das Verzeichnis an, das Sie durchsuchen möchten. . (aktuelles Verzeichnis) ist ein gültiger Pfad, zum Beispiel.

In der 2. und 3. Zeile, verwenden Sie "*.png" , "*.gif" , "*.jpg" und so weiter. Verwenden Sie so viele dieser -o -name "..." -prune Konstrukte, wie Sie Muster haben.

In der 4. Zeile benötigen Sie einen weiteren -o (er spezifiziert "oder" zu find ), die Muster, die Sie TUN wollen, und Sie brauchen entweder eine -print o -print0 am Ende des Buches. Wenn Sie nur "alles andere" haben wollen, das nach dem Beschneiden der *.gif , *.png Bilder usw., dann verwenden Sie -o -print0 und Sie sind mit der 4. Zeile fertig.

Schließlich befindet sich in der 5. Zeile die Leitung zu xargs die jede dieser resultierenden Dateien in einer Variablen speichert FILENAME . Sie geht dann grep el -IR Flaggen, die "pattern" und dann FILENAME wird erweitert durch xargs zu der Liste der Dateinamen wird, die von find .

Für Ihre spezielle Frage könnte die Erklärung etwa so aussehen:

find . \
     -name "*.png" -prune \
     -o -name "*.gif" -prune \
     -o -name "*.svn" -prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X