Ich muss .git
von meiner find
Suche ausschließen. Um dies zu erreichen, benutze ich den -path ./.git -prune
Schalter:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
Obwohl dies den Inhalt des .git-Verzeichnisses überspringt, wird das Verzeichnis selbst aufgelistet. Es funktioniert, wenn ich hinzufüge-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
Warum ist das notwendig? Ich dachte, dass beide Befehle die gleiche Ausgabe haben sollten. Die zweite Syntax ist ziemlich hässlich.
-print
, sonst gilt das Implizite-print
für die gesamte BedingungAntworten:
Die
man
Seite fürfind
gibt:Im ersten Beispiel ist dies nicht der Fall,
-path ./.git -prune
und daher wird die Standardaktion (-print
) nicht aufgerufen. Daher wird die Zeile gedruckt.quelle
Ich war verwirrt darüber, warum der
find
Befehl auch beschnittene Verzeichnisse druckte , und einige andere komplizierte Details darüber-prune
, wie es funktionierte, konnte es aber anhand einiger Beispiele herausfinden.Um die folgenden Beispiele auszuführen, erstellen Sie die folgenden Verzeichnisse und Dateien.
So erstellen Sie diese Struktur:
Verwenden Sie nun find, um nach benannten Verzeichnissen zu suchen
aa
. Kein Problem hier.Suchen Sie nach allen Verzeichnissen außer aa und wir erhalten das aktuelle Verzeichnis
.
und./bb
, was auch Sinn macht.So weit so gut, aber wenn wir verwenden
-prune
, gibt find das Verzeichnis zurück, das wir bereinigen, was mich anfangs verwirrte, weil ich erwartet hatte, dass es alle anderen Verzeichnisse zurückgibt und nicht dasjenige, das beschnitten wird.Der Grund, warum das zu bereinigende Verzeichnis zurückgegeben wird, wird nicht im
-prune
Abschnitt der Manpages erläutert, wie in Timos Antwort angegeben , sondern imEXPRESSIONS
Abschnitt:Dies bedeutet, dass der Ausdruck, da er mit dem
aa
Verzeichnisnamen übereinstimmt , als wahr ausgewertet und gedruckt wird, da find implizit ein-print
am Ende des gesamten Befehls hinzufügt . Es wird jedoch kein hinzugefügt-print
, wenn Sie die Aktion absichtlich-o -print
selbst zum Ende hinzufügen :Hier fügt der Befehl find KEIN Implizites
-print
mehr hinzu, sodass das Verzeichnis, das wir beschneiden (aa
), nicht gedruckt wird.Wenn wir also eine Klausel hinzufügen, die nach Dateien mit einem Dateinamenmuster
file*
nach dem sucht-o
, müssen Sie-print
am Ende dieser zweiten Klausel eine folgende setzen:Der Grund, warum dies funktioniert, ist der gleiche: Wenn Sie
-print
in der zweiten Klausel keine-prune
einfügen, fügt find-print
am Ende des Befehls automatisch eine hinzu , da die Aktion keine andere als die Aktion enthält , wodurch die-prune
Klausel die druckt beschnittenes Verzeichnis:Im Allgemeinen müssen Sie den
-print
Befehl in die zweite Klausel einfügen. Wenn Sie es wie das Originalplakat in der Mitte platzieren, funktioniert es nicht richtig, da die zu beschneidenden Dateien sofort gedruckt werden und die zweite Klausel keine Chance hat, die gewünschten Dateien auszuwählen:Leider hat das Originalplakat den obigen Befehl falsch platziert, indem es
-print
an der falschen Stelle platziert wurde. Es könnte für seinen speziellen Fall funktioniert haben, aber es funktioniert im allgemeinen Fall nicht.Es gibt Tausende von Menschen, die Schwierigkeiten haben zu verstehen, wie es
-prune
funktioniert. Diefind
Manpage sollte aktualisiert werden, um die unendliche weltweite Verwirrung über diesen Befehl zu vermeiden.quelle
find-4.6.0
) heißt es: "Wenn der gesamte Ausdruck keine anderen Aktionen als -prune oder -print enthält, wird -print für alle Dateien ausgeführt, für die der gesamte Ausdruck wahr ist." Funktioniert aber so wie du es beschreibst.von
man
Seite,Vielleicht können Sie Folgendes verwenden:
Dadurch wird das
.git
Verzeichnis nicht aufgelistet .Um einen Dateinamen festzulegen, können Sie Folgendes tun:
Bitte beachten Sie den
,
Komma-Operator.quelle
Hier ist eine schnelle und schmutzige Alternative:
Ich kann mich einfach nicht an
find
die komplexe Syntax erinnern ...quelle