Ich möchte alle Unterverzeichnisse durchlaufen, mit Ausnahme des Verzeichnisses "node_modules".
Antworten
Zu viele Anzeigen?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
- Die GNU-Manpage für Auswahl von Dateien und Verzeichnissen
- Eine verwandte StackOverflow-Antwort Verwenden Sie die Syntax grep --exclude/--include, um bestimmte Dateien nicht zu durchsuchen
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!
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
.
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}
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??'}
- See previous answers
- Weitere Antworten anzeigen