Por que o comportamento de find(1) difere ao adicionar explicitamente -print?

Por que o comportamento de find(1) difere ao adicionar explicitamente -print?

A página de manual find(1)diz:

Se a expressão não contiver nenhuma ação diferente de -prune, -printserá executada em todos os arquivos para os quais a expressão for verdadeira.

No entanto, parece haver uma diferença entre essas duas expressões:

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

Por que está ./fooincluído na saída deste último?

Criei o exemplo de estrutura de árvore de diretórios acima com:

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

A saída find --versionpara mim é:

find (GNU findutils) 4.4.2`

Responder1

Ah, acho que resolvi isso sozinho...

No primeiro caso, o -printé realizadoapenasquando a primeira condição ( -path '*fo*') não é verdadeira devido ao comportamento de curto-circuito de -o.

Porém, no segundo caso, o implícito -printé feito quando otodoexpressão é verdadeira - esse será o caso quando -path '*fo*'for verdadeiraou -type fé verdade. Em outras palavras, os dois comandos da minha pergunta são equivalentes a:

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

... e:

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

Eu acho que, de qualquer maneira :)

informação relacionada