![Warum unterscheidet sich das Verhalten von find(1), wenn -print explizit hinzugefügt wird?](https://rvso.com/image/1457450/Warum%20unterscheidet%20sich%20das%20Verhalten%20von%20find(1)%2C%20wenn%20-print%20explizit%20hinzugef%C3%BCgt%20wird%3F.png)
Die Manpage für find(1)
sagt:
Wenn der Ausdruck keine anderen Aktionen enthält als
-prune
,
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 ./foo
letzteres 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 --version
ist für mich:
find (GNU findutils) 4.4.2`
Antwort1
Oh, ich glaube, ich habe es selbst herausgefunden ...
Im ersten Fall -print
wird dienurwenn die erste Bedingung ( -path '*fo*'
) aufgrund des Kurzschlussverhaltens von nicht erfüllt ist -o
.
Im zweiten Fall jedoch -print
wird das implizite getan, wenn dieganzAusdruck ist wahr - das ist der Fall, wenn -path '*fo*'
wahr istoder -type f
ist 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 :)