`find -type l` corresponde ao arquivo enquanto `-type l -o -type f` não, mas apenas com `-print` explícito

`find -type l` corresponde ao arquivo enquanto `-type l -o -type f` não, mas apenas com `-print` explícito

Estou usando o GNU find.

Simplifiquei meu problema para esta sessão de shell:

$ mkdir t
$ cd t
$ touch a 
$ ln -s a b
$ find -type l
./b
$ find -type l -o -type f
./a
./b
$ find -type l -print
./b
$ find -type l -o -type f -print
./a

Talvez seja o fato de eu estar com muito sono, mas 2 coisas não fazem sentido para mim:

  • Não é true OR false == true? Como é que a adição -o -type fcausa finda interrupção da correspondência ./b, apesar -type lda correspondência?
  • A página de manual diz que essa -printé a expressão padrão, então como é que um arquivo é impresso quando não é mencionado, mas omitido quando é?

Isso também acontece quando uso -printf(o que eu realmente preciso); Imagino que outras expressões também sejam afetadas.

Responder1

Em

find -type l -o -type f -print

você especificou uma ação, portanto o padrão não se aplica mais. Mas -printfaqui é obrigatório -type fporque “e” tem uma precedência maior que “ou”; você pode pensar nisso como equivalente a

find \( -type l \) -o \( -type f -print \)

Para processar links e arquivos da mesma maneira, você precisa agrupar os testes:

find \( -type l -o -type f \) -print

informação relacionada