it-swarm.com.de

Schließen Sie .svn-Verzeichnisse von grep aus

Wenn ich mein Subversion-Arbeitskopienverzeichnis überprüfe, enthalten die Ergebnisse viele Dateien aus den .svn-Verzeichnissen. Ist es möglich, ein Verzeichnis rekursiv zu durchsuchen, aber alle Ergebnisse aus .svn-Verzeichnissen auszuschließen?

188
Kees Kist

Wenn Sie GNU Grep haben, sollte es so funktionieren:

grep --exclude-dir=".svn"

Wenn Sie sich zufällig auf einem Unix-System ohne GNU Grep befinden, versuchen Sie Folgendes:

grep -R "whatever you like" *|grep -v "\.svn/*" 
267
psychoschlumpf

Für grep> = 2.5.1a

Sie können dies in Ihre Umgebung einfügen (z. B. .bashrc)

export GREP_OPTIONS='--exclude-dir=".svn"'

PS: Dank Adrinan gibt es in meiner Version zusätzliche Anführungszeichen:

export GREP_OPTIONS='--exclude-dir=.svn'
36
osgx

Wenn Sie ack (ein 'besseres grep') verwenden, wird dies automatisch erledigt (und viele andere clevere Dinge auch!). Ein Besuch lohnt sich.

36
Brian Agnew

psychoschlumpf ist korrekt, funktioniert aber nur, wenn Sie die neueste Version von grep haben. Frühere Versionen haben nicht das --exclude-dir Möglichkeit. Wenn Sie jedoch eine sehr große Codebasis haben, kann double -grep- ewig dauern. Gib das in dein .bashrc für ein tragbares .svn- weniger grep:

alias sgrep='find . -path "*/.svn" -Prune -o -print0 | xargs -0 grep'

Jetzt können Sie dies tun:

sgrep some_var

... und erwartete Ergebnisse erhalten.

Natürlich, wenn Sie eine verrückte Person wie ich sind, die nur hat das gleiche .bashrc Überall kann man 4 Stunden damit verbringen, eine überkomplizierte Bash-Funktion zu schreiben, um sie dort abzulegen. Oder , Sie könnten einfach warten, bis eine verrückte Person wie ich es online veröffentlicht:

http://Gist.github.com/573928

7
Max Cantor
grep --exclude-dir=".svn"

funktioniert, weil der Name ".svn" ziemlich eindeutig ist. Dies kann jedoch bei einem allgemeineren Namen fehlschlagen.

grep --exclude-dir="work"

ist nicht kugelsicher, wenn Sie "/ home/user/work" und "/ home/user/stuff/work" haben, werden beide übersprungen. Es ist nicht möglich, "/ */work/*" zu definieren, um den Ausschluss nur auf den früheren Ordnernamen zu beschränken. Soweit ich experimentieren konnte, wird in GNU grep das einfache --exclude Verzeichnisse nicht ausschließen.

2
karatedog

Auf meinem GNU grep 2.5, --exclude-dirs Ist keine gültige Option. Alternativ hat dies für mich gut funktioniert:

grep --exclude="*.svn-base"

Dies sollte eine bessere Lösung sein, als alle Zeilen auszuschließen, die .svn/ Enthalten, da diese Zeilen in einer echten Datei nicht versehentlich herausgefiltert werden.

2
user193130

Zwei Greps werden den Trick machen:

  1. Der erste grep wird alles bekommen.
  2. Das zweite grep verwendet die Ausgabe des ersten grep als Eingabe (über Piping). Mit der Option -v wählt grep die Zeilen aus, die NICHT mit den Suchbegriffen übereinstimmen. Voila. Sie haben alle Ausgaben vom ersten grep übrig, die keine .svn-Datei im Dateipfad enthalten.

    -v, --invert-match Invertiert den Übereinstimmungssinn, um nicht übereinstimmende Linien auszuwählen.

     grep the_text_you_want_to_search_for * | grep -v .svn 
    
1
Joseph Huttner

Ich habe es mit Double Grep'in auf meiner riesigen Codebasis versucht und es hat ewig gedauert, also habe ich diese Lösung mit Hilfe meines Kollegen bekommen

Das Bereinigen ist viel schneller, da keine Verzeichnisse mehr verarbeitet werden können, verglichen mit 'grep -v', das alles verarbeitet und nur die Anzeige von Ergebnissen ausschließt

find . -name .svn -Prune -o -type f -print0 | xargs -0 egrep 'YOUR STRING'

Sie können diesen Befehl auch in Ihrem .bashrc alias als

alias sgrep='find . -name .svn build -Prune -o -type f -print0 | xargs -0 egrep '

Jetzt einfach benutzen

sgrep 'whatever' 
1
Sid Sarasvati

Eine andere Option, die möglicherweise nicht als akzeptable Antwort angesehen wird, besteht darin, das Repo in git zu klonen und git grep Zu verwenden.

In seltenen Fällen stoße ich auf svn-Repositorys, die so umfangreich sind, dass das Klonen mit git-svn Einfach unpraktisch ist. In diesen seltenen Fällen verwende ich eine doppelte grep-Lösung, svngrep , aber wie viele Antworten hier zeigen, kann dies bei großen Repositorys langsam sein und '.svn'-Vorkommen ausschließen, die keine Verzeichnisse sind. Ich würde behaupten, dass dies extrem selten sein würde ...

Auch in Bezug auf die langsame Leistung mehrerer Greps, wenn Sie so etwas wie git verwendet haben, scheint in svn so ziemlich alles langsam zu sein!

Eine letzte Sache .., meine Variation von svngrep geht durch Kolorierung, Vorsicht, die Implementierung ist hässlich! Ungefähr grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

1
quickshiftin

Für grep Version 2.5.1 können Sie mehrere --exclude Elemente zum Herausfiltern der .svn Dateien.

$ grep -V | grep grep
grep (GNU grep) 2.5.1

GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R  whatever ./
0
ZaSter