Ich möchte alle Vorkommen von in einem großen, von SVN verwalteten Dateisystem finden, foo
möchte jedoch keine Übereinstimmung mit Inhalten in irgendeinem .svn
Verzeichnis 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-dir
ersetzt nicht die Notwendigkeit, Dateien in der Befehlszeile aufzulisten. Sie „hängen“, weil grep
auf 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 find
tun -prune
:
find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +
Wenn Sie etwas weiter ausführen möchten, find
ist 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_OPTIONS
Variable wie folgt festlegen, um es auszuschließen:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"
Fügen Sie einfach diese Zeile zu Ihrem hinzu .bashrc
und Ihre rekursiven Greps werden nicht mehr in .svn
Verzeichnisse 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=\*~"