it-swarm.com.de

rekursives grep: bestimmte Verzeichnisse ausschließen

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 bereinigen), denke ich:

grep -Rni --exclude=/.svn/ "myfunc" .

Aber das --exclude unterstützt nur Dateimuster wie * .Java. Wie kann ich Verzeichnisse ausschließen?

47
gabor

Sie könnten in ack schauen.

Ich habe gerade damit begonnen, aber es scheint gut dafür geeignet zu sein.

10
Alex Feinman
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

Quelle: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder-using

60
Henrik

sie können stattdessen find verwenden:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

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?

6
Josh

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 grep myfunc $(./all_source), die Sortierung am Ende des Skripts völlig optional.

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -Prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

Dieses Skript gibt alle Dateinamen im Projekt zurück, die mit *.h, *.cpp, *.c, *.lua, *.*awk übereinstimmen, durchsucht jedoch nicht alle Ordner mit den Namen .svn und gen und überspringt die Ordner nach ./lib und ./vc6 (jedoch nur diejenigen, die sich direkt im Stammverzeichnis des Projekts befinden). Wenn Sie also grep myfunc $(./all_source) ausführen, greift es nur in diesen Dateien. Sie müssen dies auch aus dem Stammverzeichnis des Projekts aufrufen.

2
Mike Nelson

Es gibt auch die Option -Prune, um Folgendes zu finden:

 find . -path "*/.svn*" -Prune -o -not -type d -exec grep -ni "myfunc" {} \; -print
0
misiu_mp

Sie können dies versuchen:

grep -R  "myfunc" . | grep -v path_to_exclude/

Beispiel: Wenn Sie den Inhalt in Protokolldateien nicht durchsuchen möchten, gehen Sie wie folgt vor:

grep -R "myfunc" . | grep -v log/
0
Akshatha