1142 Stimmen

Wie kann ich Verzeichnisse von grep -R ausschließen?

Ich möchte alle Unterverzeichnisse durchlaufen, mit Ausnahme des Verzeichnisses "node_modules".

25voto

Nagev Punkte 6680

Es wurden schon viele richtige Antworten gegeben, aber ich füge diese hinzu, um einen Punkt hervorzuheben, der einige übereilte Versuche zum Scheitern gebracht hat: exclude-dir nimmt eine Muster und nicht einen Pfad zu einem Verzeichnis.

Sagen wir, Ihre Suche ist:

grep -r myobject

Und Sie stellen fest, dass Ihre Ausgabe mit Ergebnissen aus der src/other/objects-folder . Dieser Befehl wird no das gewünschte Ergebnis erzielen:

grep -r myobject --exclude-dir=src/other/objects-folder

Und Sie fragen sich vielleicht, warum exclude-dir funktioniert nicht! Um die Ergebnisse tatsächlich aus der objects-folder dann tun Sie dies einfach:

grep -r myobject --exclude-dir=objects-folder

Mit anderen Worten: Verwenden Sie einfach die Ordnername und nicht den Weg. Das ist offensichtlich, wenn man es weiß.

Aus der Manpage:

--exclude-dir=GLOB
Überspringt jedes Befehlszeilenverzeichnis mit einem Namenssuffix, das dem Muster GLOB entspricht. Wenn rekursiven Suche werden alle Unterverzeichnisse übersprungen, deren Basisname mit GLOB übereinstimmt. Ignorieren Sie alle überflüssige Schrägstriche am Ende von GLOB.

17voto

arcseldon Punkte 32403

Dies wird häufig verwendet:

grep kann in Verbindung verwendet werden mit -r (rekursiv), i (Fall ignorieren) und -o (druckt nur den passenden Teil der Zeilen). Zum Ausschluss von files verwenden. --exclude und um Verzeichnisse auszuschließen, verwenden Sie --exclude-dir .

Zusammengenommen ergibt sich etwa folgendes Bild:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

Eine Beschreibung klingt viel komplizierter, als sie tatsächlich ist. Es ist einfacher, es mit einem einfachen Beispiel zu veranschaulichen.

Beispiel:

Angenommen, ich suche nach dem aktuellen Projekt an allen Stellen, an denen ich den String-Wert explizit gesetzt habe debugger während einer Debugging-Sitzung erstellt wurden und nun überprüft/entfernt werden sollen.

Ich schreibe ein Skript namens findDebugger.sh und verwenden grep um alle Vorkommen zu finden. Allerdings:

Für Dateiausschlüsse - Ich möchte sicherstellen, dass .eslintrc wird ignoriert (dies hat tatsächlich eine Linting-Regel über debugger sollte daher ausgeschlossen werden). Ich möchte auch nicht, dass mein eigenes Skript in den Ergebnissen erwähnt wird.

Für Verzeichnisausschlüsse - ich möchte ausschließen node_modules da es viele Bibliotheken enthält, die auf debugger und an diesen Ergebnissen bin ich nicht interessiert. Außerdem möchte ich einfach weglassen .idea y .git versteckte Verzeichnisse, weil mir diese Suchorte auch egal sind und ich die Suche performant halten möchte.

Hier ist das Ergebnis - ich erstelle ein Skript namens findDebugger.sh mit:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .

6voto

DipSwitch Punkte 5154

Sie könnten etwas versuchen wie grep -R search . | grep -v '^node_modules/.*'

4voto

Nestor Urquiza Punkte 2581

Sehr nützlich, insbesondere für diejenigen, die sich mit Node.js wo wir die Suche innerhalb von "node_modules" vermeiden wollen:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

3voto

Francis Bacon Punkte 2754

Schritt 1:

vim ~/.bash_profile

search() {
    grep -InH -r --exclude-dir=*build*  -e "$1" .
}

Schritt 2:

source ~/.bash_profile

Verwendung:

search "<string_to_be_searched>"

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