grep -rn --exclude-dir={.git,node_modules,vendor} 'TODO' . findet jeden Treffer, ohne in die drei Verzeichnisse zu schauen, die fast jeden rekursiven grep in einem echten Repository ruinieren. --exclude-dir greift nur zusammen mit -r, und es vergleicht den nackten Verzeichnisnamen, nicht den Pfad. Hier das komplette Rezept, vom naiven rekursiven Suchen bis zu dem Punkt, an dem man einfach ripgrep installiert.
1. Das ganze Projekt durchsuchen
$ clai finde TODO in jeder Datei innerhalb von g→ grep -rn 'TODO' g/g/src/a.js:1:TODO fixg/node_modules/b.js:1:TODO dep
-r geht rekursiv in Unterverzeichnisse, -n fügt die Zeilennummer hinzu. Das Problem zeigt sich sofort: die Hälfte der Treffer stammt aus fremdem Code.
2. Ein Verzeichnis ausschließen
$ clai finde TODO, aber schau nicht in node_modules→ grep -rn --exclude-dir=node_modules 'TODO' g/g/src/a.js:1:TODO fix
--exclude-dir funktioniert nur zusammen mit -r. Der Verzeichnisname ist ein Muster, kein Pfad — keine Schrägstriche davor.
3. Mehrere auf einmal ausschließen
$ clai finde TODO, überspring node_modules, .git und vendor→ grep -rn --exclude-dir={.git,node_modules,vendor} 'TODO' .
Die geschweiften Klammern expandiert die Shell, bevor grep überhaupt läuft — grep bekommt drei separate Flags. In einer sh ohne Brace Expansion braucht man stattdessen drei --exclude-dir hintereinander.
4. Nur in den relevanten Dateien suchen
$ clai finde TODO nur in javascript-Dateien→ grep -rn --include='*.js' 'TODO' .
--include ist eine Positivliste. Wenn man schon weiß, wo gesucht werden soll, ist das kürzer und schneller als eine lange Kette von Ausschlüssen.
5. Nicht über Binärdateien stolpern
$ clai finde TODO, ignoriere Binärdateien→ grep -rnI 'TODO' .
Ohne -I gibt grep bei jedem Treffer in einer Binärdatei "Binary file … matches" statt einer Zeile aus — das verstopft die Ausgabe und bricht jedes Skript, das sie parst. -I überspringt solche Dateien einfach.
6. Wenn die Flags sich häufen
$ clai finde TODO im Projekt, unter Beachtung von gitignore→ rg 'TODO'
ripgrep liest standardmäßig .gitignore, überspringt .git und Binärdateien — alles Obige, ganz ohne Flags, und schneller. Wer heute zum dritten Mal eine lange --exclude-dir-Kette tippt, sollte es installieren.
Stolperfallen
--exclude-dirohne-rtut still gar nichts. Das Flag wird akzeptiert, aber nie angewendet, und man denkt, es sei kaputt.- Das Muster in
--exclude-dirist kein Pfad.--exclude-dir=src/vendortrifft nichts, weil grep den Verzeichnisnamen vergleicht, nicht den Pfad dorthin. Schreiben Sie--exclude-dir=vendor. - Das Muster gehört in Anführungszeichen.
grep -r --include=*.jslässt die Shell*.jsgegen das aktuelle Verzeichnis expandieren, bevor grep es sieht, und man bekommt eine ganz andere Suche.
Verwandte Fragen
Wie schließe ich das .git-Verzeichnis selbst aus? --exclude-dir=.git. Der führende Punkt ändert nichts — -r über ein Repository ohne dieses Flag liefert Müll aus dem Git-Objektspeicher.
Wie zähle ich Treffer, statt sie anzuzeigen? grep -rc 'TODO' . gibt eine Zahl pro Datei aus, grep -rho 'TODO' . | wc -l die Gesamtzahl der Treffer.
grep oder ripgrep? grep ist überall vorhanden und man sollte es kennen. ripgrep ist schneller und trifft standardmäßig vernünftige Entscheidungen, muss aber installiert werden — auf einem fremden Server geht das nicht immer.
Siehe auch
- Suchen und ersetzen in jeder Datei eines Projekts
- Eine Spalte aus einer CSV mit awk ausgeben
- JSON in der Kommandozeile
Schluss mit dem Auswendiglernen von Exclude-Flags – beschreiben Sie, wonach Sie suchen, CliAI schreibt den grep-Befehl. In einer Zeile installieren.