`find -type l` coincide con el archivo mientras que `-type l -o -type f` no, pero solo con `-print` explícito

`find -type l` coincide con el archivo mientras que `-type l -o -type f` no, pero solo con `-print` explícito

Estoy usando GNU find.

He simplificado mi problema a esta sesión 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

Quizás sea el hecho de que tengo mucho sueño, pero 2 cosas no tienen sentido para mí:

  • ¿No lo es true OR false == true? ¿Cómo es que agregar -o -type fhace findque deje de coincidir ./b, a pesar de -type lcoincidir?
  • La página del manual dice que esa -printes la expresión predeterminada, entonces, ¿cómo es posible que se imprima un archivo cuando no se menciona, pero se omite cuando sí se menciona?

Esto también sucede cuando uso -printf(lo que realmente necesito); Me imagino que otras expresiones también se ven afectadas.

Respuesta1

En

find -type l -o -type f -print

Ha especificado una acción, por lo que el valor predeterminado ya no se aplica. Pero -printfaquí está obligado a hacerlo -type fporque "y" tiene mayor precedencia que "o"; Puedes pensar en esto como equivalente a

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

Para procesar enlaces y archivos de la misma manera, es necesario agrupar las pruebas:

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

información relacionada