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

Почему команда 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

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

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

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

отпечатки:

mydir/.project
mydir/.classpath

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

решение1

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

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

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

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

Связанный контент