¿Por qué el comportamiento de find(1) difiere cuando se agrega explícitamente -print?

¿Por qué el comportamiento de find(1) difiere cuando se agrega explícitamente -print?

La página de manual para find(1)dice:

Si la expresión no contiene más acciones que -prune, -printse realiza en todos los archivos para los cuales la expresión es verdadera.

Sin embargo, parece haber una diferencia entre estas dos expresiones:

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

¿Por qué se ./fooincluye en la salida de este último?

Creé la estructura de árbol de directorios de ejemplo para lo anterior con:

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

El resultado de find --versionpara mí es:

find (GNU findutils) 4.4.2`

Respuesta1

Oh, creo que lo he resuelto por mi cuenta...

En el primer caso, -printse realizasolocuando la primera condición ( -path '*fo*') no es verdadera debido al comportamiento de cortocircuito de -o.

Sin embargo, en el segundo caso, lo implícito -printse hace cuando elenteroLa expresión es verdadera; ese será el caso cuando -path '*fo*'sea verdadera.o -type fes verdad. En otras palabras, los dos comandos de mi pregunta equivalen a:

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

... y:

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

Creo que, de todos modos :)

información relacionada