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

2

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

If the expression contains no actions other than -prune, -print is performed on all files for which the expression is true.

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 ./foo é incluído na saída deste último?

Eu criei a estrutura da árvore de diretórios de exemplo para o acima com:

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

A saída de find --version para mim é:

find (GNU findutils) 4.4.2'
    
por Mark Longair 15.07.2015 / 15:49

1 resposta

2

Oh, eu acho que já trabalhei por conta própria ...

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

No entanto, no segundo caso, o -print implícito é feito quando a expressão todo é verdadeira - esse será o caso quando -path '*fo*' for verdadeiro ou -type f é verdadeiro. 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:)

    
por 15.07.2015 / 16:01

Tags