Ich verwende häufig rekursives grep, um Quelldateien mit bestimmten Inhalten zu finden.
grep -Rni "myfunc" .
Bei großen Codebasen kann dies langsam werden. Daher verwende ich --incldue, um Erweiterungen / Whitelists einzuschränken.
grep -Rni --include=*.java "myfunc" .
Es wäre jedoch effizienter, ganze Unterverzeichnisse auszuschließen (zu beschneiden), denke ich:
grep -Rni --exclude=/.svn/ "myfunc" .
Aber das --exclude unterstützt nur Dateimuster wie * .java. Wie kann ich Verzeichnisse ausschließen?
linux
command-line
grep
Gabor
quelle
quelle
Quelle: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using
quelle
./dev
wird MIT AUSGESCHLOSSEN./foo/bar/dev
. Verwenden Sie--exclude-dir=./dev
diese Option nur für den ersten Fall.bash grep -r --exclude-dir={dev,sys,proc} PATTERN data
Das einzige Problem beim Globbing ist, dass ich es in meiner Bash nicht zum Laufen bringen kann. In diesem Fall muss ich sie getrennt halten.{}
einen einzelnen Eintrag verwenden, benötigen Sie wahrscheinlich ein unäres Komma, um ein Array zu erstellen (nicht sicher, wie Bash damit umgeht). Stattdessen habe ich in meinen .bash_aliases einen Alias erstellt, der eine Liste von Ordnern durchläuft, die ich normalerweise immer ausschließen möchte, z. B. .git, .svn, .hg, .cache. Anschließend füge ich sie über eine Schleife mit hinzu--exclude-dir $dir
und erweitern Sie dann dieses Array in den Grep-Alias.Sie können stattdessen find verwenden:
OK, das ist ein bisschen rückwärts, Sie erhalten zuerst die grep-Ergebnisse und dann den Pfad. Vielleicht hat jemand anderes eine bessere Antwort?
quelle
Hier ist ein vollständiges Beispiel eines Skripts in einem meiner Projekte, das möglicherweise hilfreich ist. Ich bezeichne diese Datei als "all_source" (als ausführbar markiert) und füge sie in das Stammverzeichnis meines Projekts ein. Nenne sie dann so, wie es
grep myfunc $(./all_source)
die Sortierung am Ende des Skripts ist Optional.Dieses Skript gibt alle Dateinamen im Projekt zurück, die übereinstimmen
*.h, *.cpp, *.c, *.lua, *.*awk
, durchsucht jedoch nicht alle Ordner mit den Namen .svn und gen und überspringt die Ordner nach./lib
und./vc6
(sondern nur diejenigen, die sich direkt hinter dem Projektstamm befinden). Wenn Sie dies tungrep myfunc $(./all_source)
, greift dies nur in diesen Dateien. Sie müssen dies auch aus dem Stammverzeichnis des Projekts aufrufen.quelle
Es gibt auch die Option -prune, um Folgendes zu finden:
quelle
Sie können dies versuchen:
Beispiel: Wenn Sie den Inhalt in Protokolldateien nicht durchsuchen möchten, gehen Sie wie folgt vor:
quelle