Suchen Sie rekursiv nach Ordnern, schließen Sie jedoch den SVN-Unterordner aus


10

Ich möchte alle Vorkommen fooin einem großen Dateisystem finden, das von SVN verwaltet wird, aber ich möchte nichts in einem .svnVerzeichnis finden.

Ich bekomme sofort Übereinstimmungen, wenn ich es tue, grep -l -e 'foo' *aber wenn ich versuche, die svn-Verzeichnisse mit grep -l -e 'foo' --exclude-dir=".svn"dem Befehl auszuschließen, hängt es einfach.

Was mache ich falsch?

Antworten:


11

--exclude-dirersetzt nicht die Notwendigkeit, Dateien in der Befehlszeile aufzulisten. Sie "hängen", weil Sie grepauf die Standardeingabe warten.

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

Erwägen Sie die Verwendung von ack , das .svnstandardmäßig ähnliche Ordner ausschließt und viele andere Funktionen bietet.


2
Reiniger , wenn Sie ändern , *um ., falls es andere versteckte Ordner , die durchsucht werden soll.
Kevin

oder vielleicht möchten Sie --recursive .stattdessen verwenden, da das OP bereits GNU hat grep.
jw013

Persönlich habe ich shopt -s dotglobin Bash, *enthält also schon Punktedateien. -rist nett, aber ackmacht das standardmäßig auch :)
Ephemient

5

Sie könnten an ack interessiert sein . Es tut rekursive Suche (und andere grep-ähnliche Behandlungen ), und schließt Verzeichnisse wie Svn oder .git standardmäßig.


Als Folge davon verwende ich derzeit agdie ähnliche, aber schnellere.
WhyNotHugo

2

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

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

Wenn Sie etwas weiter ausführen möchten, findist es besser als eine Ebene grep -r:

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

1

Wenn Sie nicht wie .svn immer in Verzeichnisse greifen möchten, können Sie die $GREP_OPTIONSVariable so einstellen , dass sie wie folgt ausgeschlossen wird:

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

.bashrcFügen Sie diese Zeile einfach zu Ihrem hinzu, und Ihre rekursiven Greps werden nicht mehr in .svnVerzeichnisse eingegeben . Natürlich kann es so reich sein, wie Sie wollen:

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

1
Ich persönlich mache dies mit einem Alias, damit ich die Ausschlussliste umgehen kann, wenn ich tatsächlich in diesen Ordnern suchen muss. Ich kann nur Bare Grep verwenden, ohne die Variable deaktivieren / nullen zu müssen. Außerdem kann ich eine Liste von Ordnern verwalten, die ich einfach erweitern und automatisch zu meiner Liste der Ausschlüsse hinzufügen kann, ohne mehr tippen zu müssen.
Dragon788

Das ist ein guter Ansatz. Es hat auch den Vorteil, dass Sie nicht vergessen, eine Variable festzulegen, wenn Sie in die Ordner greifen müssen. (Nicht, dass ich sie jemals hätte greifen müssen.) Aber TBH heutzutage benutze ich ag (einen Bestätigungsklon) für diese Dinge ^^
brandizzi

0

Hier ist auch eine awk-Lösung:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

Grundsätzlich sollten Sie aus allen Dateien diejenigen entfernen, die mit /.svn/ übereinstimmen, und von diesen nur diejenigen drucken, die mit / foo / übereinstimmen. Ich mag diese Lösung auch, da Sie die Ergebnisse leicht mit ls verwenden können. Zum Beispiel können Sie verwenden

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

um eine nach Änderungsdatum sortierte Listenansicht anzuzeigen. Es ist auch schön, den vollständigen Pfad der Ergebnisse zu haben, wenn Sie etwas anderes mit ihnen machen möchten (sie öffnen, ausführen usw.).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.