1142 Stimmen

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

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

1404voto

Johnsyweb Punkte 128606

Aktuelle Versionen von GNU Grep (>= 2.5.2 ) bieten:

--exclude-dir=dir

der Verzeichnisse ausschließt, die dem Muster dir von rekursiven Verzeichnissuchen.

Das können Sie tun:

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

Weitere Informationen zu Syntax und Verwendung finden Sie unter

Für ältere GNU Greps und POSIX Grep verwenden find wie in anderen Antworten vorgeschlagen.

Oder verwenden Sie einfach ack ( bearbeiten : oder Der Silbersucher ) und dann ist Schluss damit!

620voto

hornetbzz Punkte 8772

LÖSUNG 1 (kombinieren find y grep )

Der Zweck dieser Lösung besteht nicht darin, sich mit grep Leistung, sondern um eine portable Lösung zu zeigen: sollte auch mit busybox oder GNU Versionen älter als 2.5 funktionieren.

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

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

Dann kombinieren Sie 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 (unter Verwendung der --exclude-dir Option von grep ):

Sie kennen diese Lösung bereits, aber ich füge sie hinzu, da sie die neueste und effizienteste Lösung ist. Beachten Sie, dass diese Lösung weniger portabel, aber besser lesbar ist.

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

Um mehrere Verzeichnisse auszuschließen, verwenden Sie --exclude-dir als:

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

LÖSUNG 3 (Ag)

Wenn Sie häufig Code durchsuchen, Ag (Der Silbersucher) ist eine viel schnellere Alternative zu grep, die für die Suche nach Code angepasst ist. Zum Beispiel ignoriert es automatisch Dateien und Verzeichnisse, die in .gitignore so dass Sie nicht immer wieder die gleichen umständlichen Ausschlussoptionen an grep o find .

127voto

Azodium Punkte 1725

Wenn Sie Folgendes ausschließen möchten mehrere Verzeichnisse :

"r" für rekursiv, "l", um nur Namen von Dateien zu drucken, die Übereinstimmungen enthalten und "i", um Groß- und Kleinschreibung zu ignorieren:

grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

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

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

Hinweis: Das obige Beispiel muss Root sein

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

125voto

Derek Veit Punkte 3220

Diese Syntax

--exclude-dir={dir1,dir2}

wird von der Shell (z.B. Bash) expandiert, nicht von grep in diese:

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

Die Quotierung verhindert, dass sich die Schale ausdehnt, so dass dies nicht funktioniert:

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

Die Muster, die mit --exclude-dir sind die gleiche Art von Mustern, die in der Manpage für das Programm --exclude Option:

--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 Schale wird im Allgemeinen Versuchen Sie um ein solches Muster selbst zu erweitern. Um dies zu vermeiden, sollten Sie es zitieren:

--exclude-dir='dir?'

Sie können die geschweiften Klammern und das Ausschlussmuster in Anführungszeichen zusammen wie folgt verwenden:

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

32voto

0xcaff Punkte 11966

Wenn Sie nach Code in einem Git-Repository suchen und node_modules ist in Ihrem .gitignore können Sie verwenden git grep . git grep durchsucht die verfolgten Dateien im Arbeitsbaum und ignoriert dabei alles von .gitignore

git grep "STUFF"

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