¿Por qué find's -exec solo se ejecuta en un resultado?

¿Por qué find's -exec solo se ejecuta en un resultado?

Esto es lo que verifiqué:

find mydir -maxdepth 2 -name .project -or -name .classpath

da salida:

mydir/.project
mydir/.classpath

Mientras tanto

find mydir -maxdepth 2 -name .project -or -name .classpath -exec echo {} \;

da salida:

mydir/.classpath

entonces solo aparece 1 artículo encontrado, ¿por qué?

xargs funciona como se esperaba:

find mydir -maxdepth 2 -name .project -or -name .classpath | xargs -I {} echo {};

huellas dactilares:

mydir/.project
mydir/.classpath

¿Me estoy perdiendo algo sobre -exec?

Respuesta1

Una findexpresión es básicamente una lista de predicados (condiciones booleanas). En casi todos los contextos booleanos, incluidas findlas expresiones, el ANDoperador tiene prioridad sobre OR. Si agrego algunos paréntesis para ilustrar explícitamente las reglas de precedencia, su segunda findexpresión es lógicamente equivalente a

( -name .project ) OR ( -name .classpath AND -exec echo)

Para obtener el comportamiento deseado, necesita

find mydir -maxdepth 2 \( -name .project -o -name .classpath \) -exec ... {} \;

información relacionada