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

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

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

  • Может ли команда find быть более компактной?
  • Использование чернослива не работает в команде find
  • Почему 2 машины linux ведут себя по-другому с командой того же синтаксиса?
  • Записывать записи для каждой директории в дереве
  • Поиск разрешений для файлов, кроме 755
  • Что означает {} + в команде find -exec?
  • дает выход:

     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
  • Найти файлы, которые не находятся в .gitignore
  • Улучшите работу find -exec ...
  • `find -delete` Erased Everything
  • Как отслеживать, какие файлы в настоящее время растут в каталоге
  • Найти все символические ссылки в каталоге и изменить цель на другой каталог
  • One Solution collect form web for “Почему find -exec выполняет только один результат?”

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

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

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

     find mydir -maxdepth 2 \( -name .project -o -name .classpath \) -exec ... {} \; 
    Linux и Unix - лучшая ОС в мире.