A página de manual find(1)
diz:
Se a expressão não contiver nenhuma ação diferente de
-prune
,
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á ./foo
incluí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 --version
para 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 :)