'encontrar -tipo l' corresponde ao arquivo enquanto '-tipo l -o -tipo f' não, mas somente com explícito '-print' [duplicado]

0

Estou usando o find do GNU.

Eu 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 que estou com muito sono, mas 2 coisas não fazem sentido para mim:

  • Não é true OR false == true ? Como é que adicionar -o -type f faz com que find pare de corresponder a ./b , apesar de -type l corresponderem?
  • A página de manual diz que -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 usamos -printf (o que eu realmente preciso); Imagino que outras expressões também sejam afetadas.

    
por JoL 18.04.2017 / 10:51

1 resposta

1

Em

find -type l -o -type f -print

você especificou uma ação, então o padrão não se aplica mais. Mas -printf aqui está vinculado a -type f porque “e” tem uma precedência maior que “ou”; você pode pensar nisso como equivalente a

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

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

find \( -type l -o -type f \) -print
    
por 18.04.2017 / 10:57