Почему find -exec выполняет только один результат?

Вот что я проверил:

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

дает выход:

 mydir/.project mydir/.classpath 

между тем

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

дает выход:

 mydir/.classpath 

поэтому указан только один найденный элемент, почему?

xargs работает так, как ожидалось:

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

печатает:

 mydir/.project mydir/.classpath 

Я что-то пропустил -exec ?

Выражение find в основном представляет собой список предикатов (булевых условий). Почти во всех булевых контекстах, включая выражения find , оператор AND имеет приоритет над OR . Если я добавлю некоторые круглые скобки, чтобы явно проиллюстрировать правила приоритета, ваше второе выражение find логически эквивалентно

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

Чтобы получить желаемое поведение, вам нужно

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