Ordner rekursiv durchsuchen, aber SVN-Unterordner ausschließen

Ordner rekursiv durchsuchen, aber SVN-Unterordner ausschließen

Ich möchte alle Vorkommen von in einem großen, von SVN verwalteten Dateisystem finden, foomöchte jedoch keine Übereinstimmung mit Inhalten in irgendeinem .svnVerzeichnis finden.

Wenn ich das tue, erhalte ich sofort Übereinstimmungen grep -l -e 'foo' *, aber wenn ich versuche, die SVN-Verzeichnisse mit grep -l -e 'foo' --exclude-dir=".svn"dem Befehl auszuschließen, bleibt er einfach hängen.

Was mache ich falsch?

Antwort1

--exclude-dirersetzt nicht die Notwendigkeit, Dateien in der Befehlszeile aufzulisten. Sie „hängen“, weil grepauf die Standardeingabe gewartet wird.

grep -l -e 'foo' --exclude-dir=".svn"*

Erwägen Sie die Verwendungack.svn, das standardmäßig ähnliche Ordner ausschließt (und über viele andere Funktionen verfügt).

Antwort2

Das könnte Sie interessierenack. Es führt rekursive Suchvorgänge (und andere grep-ähnliche Operationen) durch und schließt Verzeichnisse aus wie.svnoder.gitstandardmäßig.

Antwort3

Die grep --exclude-dir...Lösung sollte in Ordnung sein, aber um einen anderen Weg aufzuzeigen, können Sie dies mit findtun -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Wenn Sie etwas weiter ausführen möchten, findist ein einfaches besser grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

Antwort4

Wenn Sie nicht in Verzeichnisse wie.svn immerSie können die $GREP_OPTIONSVariable wie folgt festlegen, um es auszuschließen:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Fügen Sie einfach diese Zeile zu Ihrem hinzu .bashrcund Ihre rekursiven Greps werden nicht mehr in .svnVerzeichnisse einsteigen. Natürlich kann es so umfangreich sein, wie Sie möchten:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

verwandte Informationen