Ich möchte alle Unterverzeichnisse durchlaufen, mit Ausnahme des Verzeichnisses "node_modules".
Antworten
Zu viele Anzeigen?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.
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 .
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