Warum unterscheidet sich das Verhalten von find(1), wenn -print explizit hinzugefügt wird?

Warum unterscheidet sich das Verhalten von find(1), wenn -print explizit hinzugefügt wird?

Die Manpage für find(1)sagt:

Wenn der Ausdruck keine anderen Aktionen enthält als -prune, -printwird auf allen Dateien ausgeführt, für die der Ausdruck wahr ist.

Es scheint jedoch einen Unterschied zwischen diesen beiden Ausdrücken zu geben:

$ find . -path '*fo*' -prune -o -type f -print
./bar/xzyzzy
$ find . -path '*fo*' -prune -o -type f
./foo
./bar/xzyzzy

Warum ist ./fooletzteres in der Ausgabe enthalten?

Ich habe die Beispiel-Verzeichnisbaumstruktur für das Obige mit folgendem erstellt:

$ cd $(mktemp -d)
$ mkdir foo
$ mkdir bar
$ touch foo/quux
$ touch bar/xzyzzy

Die Ausgabe find --versionist für mich:

find (GNU findutils) 4.4.2`

Antwort1

Oh, ich glaube, ich habe es selbst herausgefunden ...

Im ersten Fall -printwird dienurwenn die erste Bedingung ( -path '*fo*') aufgrund des Kurzschlussverhaltens von nicht erfüllt ist -o.

Im zweiten Fall jedoch -printwird das implizite getan, wenn dieganzAusdruck ist wahr - das ist der Fall, wenn -path '*fo*'wahr istoder -type fist wahr. Mit anderen Worten, die beiden Befehle in meiner Frage sind gleichwertig mit:

$ find . \( -path '*fo*' -prune \) -o \( -type f -print \)
./bar/xzyzzy

... Und:

$ find . \( -path '*fo*' -prune -o -type f \) -print
./foo
./bar/xzyzzy

Denke ich jedenfalls :)

verwandte Informationen