unix - recursive - linux grep-- exclude dir




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

Ich suche die Zeichenkette foo= in Textdateien in einem Verzeichnisbaum. Es ist auf einem gewöhnlichen Linux-Rechner, ich habe Bash-Shell:

grep -ircl "foo=" *

In den Verzeichnissen befinden sich auch viele Binärdateien, die "foo =" entsprechen. Da diese Ergebnisse nicht relevant sind und die Suche verlangsamen, möchte ich, dass grep das Durchsuchen dieser Dateien (hauptsächlich JPEG- und PNG-Bilder) überspringt. Wie würde ich das tun?

Ich weiß, dass es die --exclude=PATTERN und --include=PATTERN gibt, 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 exclude und variants haben nichts Relevantes gefunden

Wenn es nur in bestimmten Dateien einen besseren Weg zum Greifen gibt, bin ich dafür; Verschieben der problematischen Dateien ist keine Option. Ich kann nicht nur bestimmte Verzeichnisse durchsuchen (die Verzeichnisstruktur ist ein großes Chaos, mit allem überall). Außerdem kann ich nichts installieren, also habe ich mit gängigen Tools zu tun (wie grep oder dem vorgeschlagenen Fund ).


In den Verzeichnissen befinden sich auch viele Binärdateien. Ich kann nicht nur bestimmte Verzeichnisse durchsuchen (die Verzeichnisstruktur ist ein großes Durcheinander). Gibt es eine bessere Möglichkeit, nur in bestimmten Dateien zu gräten?

ripgrep

Dies ist eines der schnellsten Werkzeuge, mit denen Sie Ihr aktuelles Verzeichnis rekursiv durchsuchen können. Es ist in Rust , auf der Ruste Regex-Motor für maximale Effizienz gebaut. Überprüfen Sie die detaillierte Analyse hier .

So können Sie einfach ausführen:

rg "some_pattern"

Es respektiert Ihr .gitignore und überspringt automatisch versteckte Dateien / Verzeichnisse und Binärdateien.

Sie können Dateien und Verzeichnisse mithilfe von -g / --glob weiterhin anpassen oder ausschließen. Globale Regeln passen zu .gitignore globs. Überprüfen Sie man rg für Hilfe.

Auf MacOS kannst du über brew install ripgrep .


git grep

Verwenden Sie git grep das für die Leistung optimiert ist und bestimmte Dateien durchsuchen soll.

In der Voreinstellung ignoriert es binäre Dateien und .gitignore Ihre .gitignore . Wenn Sie nicht mit der Git-Struktur arbeiten, können Sie sie trotzdem verwenden, indem Sie --no-index .

Beispielsyntax:

git grep --no-index "some_pattern"

Um bestimmte Dateien immer noch auszuschließen, siehe: Ausschließen bestimmter Verzeichnisse / Dateien von der Git-Grep-Suche .


Auf CentOS 6.6 / Grep 2.6.3 muss ich es so verwenden:

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

Beachten Sie das Fehlen von Gleichheitszeichen "=" (andernfalls - --include , --exclude , include-dir und --exclude-dir werden ignoriert)


Bitte werfen Sie einen Blick auf ack , der für genau diese Situationen ausgelegt ist. Ihr Beispiel von

grep -ircl --exclude=*.{png,jpg} "foo=" *

ist mit ack as gemacht

ack -icl "foo="

weil ack in Binärdateien standardmäßig nicht sucht und -r standardmäßig aktiviert ist. Und wenn Sie nur CPP- und H-Dateien wünschen, dann tun Sie es einfach

ack -icl --cpp "foo="

Die --binary-files=without-match mit GNU grep das Überspringen von Binärdateien. (Entspricht dem -I Schalter, der an anderer Stelle erwähnt wird.)

(Dies könnte eine aktuelle Version von grep erfordern; 2.5.3 hat es zumindest.)


Diese Skripte erfüllen nicht das ganze Problem ... Versuchen Sie es besser:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

Dieses Skript ist so besser, weil es "echte" reguläre Ausdrücke verwendet, um Verzeichnisse von der Suche zu vermeiden. Einfach Ordner- oder Dateinamen mit "\ |" trennen auf dem grep -v

Genieß es! gefunden auf meiner Linux-Shell! XD


Ich bin ein Dilettant, bewilligt, aber so sieht mein ~ / .bash_profile aus:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

Beachten Sie, dass ich zum Ausschluss von zwei Verzeichnissen zweimal --exclude-dir verwenden musste.


Ich finde die Ausgabe von grepping grep manchmal sehr hilfreich:

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

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


In Grep 2.5.1 müssen Sie diese Zeile zu ~ / .bashrc oder ~ / .bash Profil hinzufügen

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

In grep 2.5.3 wurde der Parameter --exclude-dir eingeführt, der so funktioniert, wie Sie möchten.

grep -rI --exclude-dir=\.svn PATTERN .

Sie können auch eine Umgebungsvariable festlegen: GREP_OPTIONS = "- exclude-dir = .svn"

Ich werde Votum für die zweite Sekunde ack , es ist das Beste.


Schau dir das an.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

Versuche dies:

  1. Erstellen Sie einen Ordner mit dem Namen " --F " unter currdir .. (oder verknüpfen Sie einen anderen Ordner umbenannt in " --F ", dh double-minus-F .
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *

Wenn Sie der Verwendung von find nicht abgeneigt sind, gefällt -prune Funktion -prune :

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, in dem Sie suchen möchten. . (aktuelles Verzeichnis) ist beispielsweise ein gültiger Pfad.

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 vierten Zeile benötigen Sie ein anderes -o (es spezifiziert "oder"), die Muster, die Sie wollen, und Sie brauchen entweder ein -print oder -print0 am Ende davon. Wenn Sie nur noch "alles andere" möchten, nachdem die *.gif , *.png Bilder usw. -o -print0 , verwenden Sie -o -print0 und Sie sind fertig mit der vierten Zeile.

Schließlich ist in der fünften Zeile die Pipe zu xargs die jede dieser resultierenden Dateien aufnimmt und in einer Variablen FILENAME . Danach übergibt grep die -IR Flags, das "pattern" , und dann wird FILENAME um xargs erweitert, um zu der Liste der gefundenen Dateinamen zu werden.

Für Ihre spezielle Frage sieht die Aussage möglicherweise so aus:

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


Wenn Sie nicht rekursiv suchen, können Sie die Dateinamen mit Glop-Mustern vergleichen .

grep "foo" *.{html,txt}

beinhaltet html und txt. Es wird nur im aktuellen Verzeichnis gesucht.

In den Unterverzeichnissen suchen:

   grep "foo" */*.{html,txt}

In den Sub-Unterverzeichnissen:

   grep "foo" */*/*.{html,txt}

passend für tcsh .alias Datei:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

Ich brauchte eine Weile, um herauszufinden, dass der {mm, m, h, cc, c} Teil nicht in Anführungszeichen stehen sollte. ~ Keith







grep