find Verzeichnis ausschließen

13

Ich bin unter Linux (Ubuntu) und möchte bestimmte Verzeichnisse (z. B. .hg) ausschließen, wenn ich a

find | less  

Ich habe Folgendes versucht, um das .hg-Verzeichnis von der Auflistung auszuschließen, aber es scheint nicht zu funktionieren.

find -type d \( ! -iname \.hg \)
find -type d \( ! -name \.hg \)
find -type d \( ! -iname .hg \)

Wie schließe ich .directoryeinen Suchbefehl aus?

Senthil Kumaran
quelle

Antworten:

13

Bei der Suche nach einer ähnlichen findLösung habe ich die hilfreiche Erklärung zur Verwendung der Option '-prune' von 'find' in sh entdeckt. von Laurence Gonsalves .

Sie könnten etwas verwenden wie:

find . \( -type d -name .hg -prune \) -o \( -type f -name "foo" -print \)

oder (ohne den Namen)

find . \( -type d -name .hg -prune \) -o \( -type f -print \)

Die (entkommen) Klammern \(und \)Gruppe der Tests ( typeund name) und entsprechende Aktionen ( pruneund printist) zusammen nach links und rechts von der OR ( -o).

Da es -oeine niedrigere Priorität als Nebeneinander hat, können Sie die Klammern weglassen, wenn Sie möchten. Bei vielen findImplementierungen können Sie auch das Finale überspringen -print.

find . -type d -name .hg -prune -o -type f -name "foo" -print
fheub
quelle
1
Ich wollte gerade meine Lösung schreiben, aber es scheint genau das zu sein. Persönlich würde ich das -pruneInnere des ersten Satzes von Klammern und das Innere des -type f -printzweiten Satzes einfügen, um die und / oder Operationen offensichtlicher zu machen, aber ansonsten erscheint mir dies genau richtig.
me_and
Ich habe die Klammern (und ihre Argumentation) dank @me_ands Kommentar verbessert.
Fheub
2

Schauen Sie sich Folgendes an ack: http://betterthangrep.com/

Zusätzlich zu einer angemessenen Anzahl von standardmäßig ausgeschlossenen Ordnern (.hg ist beispielsweise ein Standardausschluss) ist es einfach, neue Ordner auszuschließen:

ack --ignore-dir=.directory search_term

Um dies auf Ihren Anwendungsfall zurückzuführen, in dem Sie nach einer Liste von Dateien suchen, verwenden Sie die -fOption wie folgt:

ack -f --ignore-dir=.directory

Ich habe vom Schreiben von verschachtelten Suchbefehlen zu einfachen Bestätigungsbefehlen gewechselt.

Tipp: Fügen Sie häufig verwendete Befehlszeilenoptionen (z. B. ausgeschlossene Ordner) in eine .ackrc-Datei ein.

Brian Leathem
quelle
Auf der Grundlage der find | lessin der Frage, sucht das OP nach einer einfachen Liste von Dateien. Wie hilft das dabei?
ein CVn
@ MichaelKjörling Wie ich in meiner Antwort angegeben habe, enthält die Option -f eine Liste von Dateien.
Brian Leathem
-2

Du kannst es versuchen

find \( ! -regex '.*/\.directory\(\|/.*\)' \)
yuyichao
quelle
Verdammt sicher, dass das nichts mit dem zu tun hat, wonach das OP gefragt hat.
me_and
Ich dachte nur, das ist, was er meint.directory
yuyichao