it-swarm.com.de

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

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

565
TIMEX

LÖSUNG 1 (kombiniere find und grep)

Der Zweck dieser Lösung ist nicht, sich mit der Leistung von grep zu befassen, sondern eine tragbare Lösung zu zeigen: sollte auch mit Busybox- oder GNU -Versionen funktionieren, die älter als 2.5 sind.

Verwenden Sie find, um die Verzeichnisse foo und bar auszuschließen:

find /dir \( -name foo -Prune \) -o \( -name bar -Prune \) -o -name "*.sh" -print

Kombinieren Sie dann find und die nicht rekursive Verwendung von grep als tragbare Lösung:

find /dir \( -name node_modules -Prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

LÖSUNG 2 (rekursive Verwendung von grep):

Sie kennen diese Lösung bereits, aber ich füge sie hinzu, da es sich um die neueste und effizienteste Lösung handelt. Beachten Sie, dass dies eine weniger tragbare, aber besser lesbare Lösung ist.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Verwenden Sie zum Ausschließen mehrerer Verzeichnisse --exclude-dir als:

--exclude-dir={node_modules,dir1,dir2,dir3}

LÖSUNG 3 (Ag)

Wenn Sie häufig nach Code suchen, ist Ag (The Silver Searcher) eine viel schnellere Alternative zu grep, die für die Suche nach Code angepasst ist. Beispielsweise werden Dateien und Verzeichnisse, die in .gitignore aufgeführt sind, automatisch ignoriert, sodass Sie nicht immer dieselben umständlichen Ausschlussoptionen an grep oder find übergeben müssen.

277
hornetbzz

Neueste Versionen von GNU Grep (> = 2.5.2 ) zur Verfügung stellen:

--exclude-dir=dir

dies schließt Verzeichnisse, die dem Muster dir entsprechen, von der Suche nach rekursiven Verzeichnissen aus.

Sie können also Folgendes tun:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Weitere Informationen zu Syntax und Verwendung finden Sie unter

Verwenden Sie für ältere GNU Greps und POSIX Grep find, wie in anderen vorgeschlagen Antworten.

Oder verwenden Sie einfach ack ( Edit : oder The Silver Searcher ) und fertig!

918
Johnsyweb

Wenn Sie mehrere Verzeichnisse ausschließen möchten:

"r" für rekursiv, "l" zum Drucken nur von Dateinamen mit Übereinstimmungen und "i" zum Ignorieren von Groß- und Kleinschreibung:

 
 grep -rli --exclude-dir = {dir1, dir2, dir3} Schlüsselwort /path/to/search[.____.

Beispiel: Ich möchte Dateien finden, die das Wort "Hallo" enthalten. Ich möchte in allen meinen Linux-Verzeichnissen suchen außerproc Verzeichnis, boot Verzeichnis, sys Verzeichnis und root Verzeichnis:

 
 grep -rli --exclude-dir = {proc, boot, root, sys}

Hinweis: Das obige Beispiel muss root sein

Anmerkung 2 (laut @skplunkerin): Fügen Sie keine Leerzeichen nach den Kommas in {dir1,dir2,dir3} ein

69
Azodium

Diese Syntax

--exclude-dir={dir1,dir2}

wird durch die Shell (z. B. Bash), nicht durch grep, zu folgendem erweitert:

--exclude-dir=dir1 --exclude-dir=dir2

Das Zitieren hindert die Shell daran, sie zu erweitern, so dass dies nicht funktioniert:

--exclude-dir='{dir1,dir2}'    <-- this won't work

Die mit --exclude-dir verwendeten Muster entsprechen den in der Manpage für die Option --exclude beschriebenen Mustern:

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

Die Shell wird im Allgemeinen versuchen ein solches Muster selbst zu erweitern. Um dies zu vermeiden, sollten Sie es zitieren:

--exclude-dir='dir?'

Sie können die geschweiften Klammern und zitierten Ausschlussmuster wie folgt zusammen verwenden:

--exclude-dir={'dir?','dir??'}

Ein Muster kann mehrere Pfadsegmente umfassen:

--exclude-dir='some*/?lse'

Dies würde ein Verzeichnis wie topdir/something/else ausschließen.

39
Derek Veit

Verwenden Sie dies häufig:

grep kann in Verbindung mit -r (rekursiv), i (Groß-/Kleinschreibung ignorieren) und -o (druckt nur einen Teil der Zeilen) verwendet werden. Zum Ausschließen von files verwenden Sie --exclude und zum Ausschließen von Verzeichnissen --exclude-dir.

Wenn Sie es zusammenfassen, erhalten Sie Folgendes:

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

Wenn man es beschreibt, klingt es weitaus komplizierter als es tatsächlich ist. Einfacher mit einem einfachen Beispiel zu veranschaulichen.

Beispiel:

Angenommen, ich suche nach dem aktuellen Projekt für alle Stellen, an denen ich den Zeichenfolgenwert debugger während einer Debugsitzung explizit festgelegt habe, und möchte nun überprüfen/entfernen.

Ich schreibe ein Skript mit dem Namen findDebugger.sh und benutze grep, um alle Vorkommen zu finden. Jedoch:

Ausschluss von Dateien - Ich möchte sicherstellen, dass .eslintrc ignoriert wird (dies hat tatsächlich eine Flusenregel für debugger und sollte daher ausgeschlossen werden). Ebenso möchte ich nicht, dass mein eigenes Skript in den Ergebnissen referenziert wird.

Für Verzeichnisausschlüsse - Ich möchte node_modules ausschließen, da es viele Bibliotheken enthält, die auf debugger verweisen, und ich bin nicht an diesen Ergebnissen interessiert. Außerdem möchte ich nur die versteckten Verzeichnisse .idea und .git weglassen, da mir diese Suchorte ebenfalls egal sind, und ich möchte die Suche weiterhin durchführen.

Also 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 .
13
arcseldon

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

9
DipSwitch

Wenn Sie in einem Git-Repository nach Code suchen und node_modules in Ihrem .gitignore ist, können Sie git grep verwenden. git grep durchsucht die nachverfolgten Dateien in der Arbeitsstruktur und ignoriert dabei alles aus .gitignore

git grep "STUFF"
8
0xcaff

Sehr nützlich, besonders für diejenigen, die sich mit Node.js beschäftigen, bei denen wir vermeiden wollen, in "node_modules" zu suchen:

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

Ein einfacher Arbeitsbefehl:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

Oben grep ich nach dem Text "creativecommons.org" im aktuellen Verzeichnis "dspace" und schließe dirs {log, assetstore} aus.

Getan.

2
Dung
find . ! -name "node_modules" -type d 
1
Jack

dieser arbeitet für mich

grep <stuff> -R --exclude-dir=<your_dir>

1
angelo.mastro

Viele richtige Antworten wurden hier gegeben, aber ich füge diese hinzu, um einen Punkt hervorzuheben, der einige hastige Fehlversuche verursacht hat: exclude-dir nimmt ein Muster, keinen Pfad zu einem Verzeichnis .

Angenommen, Ihre Suche lautet:

grep -r myobject

Und Sie bemerken, dass Ihre Ausgabe mit Ergebnissen aus dem src/other/objects-folder überfüllt ist. Dieser Befehl wird nicht das beabsichtigte Ergebnis liefern:

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

Und Sie fragen sich vielleicht, warum exclude-dir nicht funktioniert! Gehen Sie wie folgt vor, um Ergebnisse aus dem objects-folder auszuschließen:

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

Mit anderen Worten, verwenden Sie einfach Ordnername, nicht den Pfad. Offensichtlich, sobald Sie es wissen.

Von der Manpage:

--exclude-dir = GLOB
Überspringen Sie alle Befehlszeilenverzeichnisse mit einem Namenssuffix, das dem Muster GLOB entspricht. Überspringen Sie bei der rekursiven Suche alle Unterverzeichnisse, deren Basisname mit GLOB übereinstimmt. Ignorieren Sie redundante abschließende Schrägstriche in GLOB.

0
Nagev

Eine einfachere Möglichkeit wäre, Ihre Ergebnisse mit "grep -v" zu filtern.

grep -i needle -R * | grep -v node_modules

0
Morris