Por que o -exec do find é executado apenas em um resultado?

Por que o -exec do find é executado apenas em um resultado?

Aqui está o que verifiquei:

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

dá saída:

mydir/.project
mydir/.classpath

Enquanto isso

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

dá saída:

mydir/.classpath

então apenas 1 item encontrado está listado, por quê?

xargs funciona conforme esperado:

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

impressões:

mydir/.project
mydir/.classpath

Estou faltando alguma coisa -exec?

Responder1

Uma findexpressão é basicamente uma lista de predicados (condições booleanas). Em quase todos os contextos booleanos, incluindo findexpressões, o ANDoperador tem precedência sobre OR. Se eu adicionar alguns parênteses para ilustrar explicitamente as regras de precedência, sua segunda findexpressão será logicamente equivalente a

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

Para obter o comportamento desejado, você precisa

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

informação relacionada