
Вот что я проверил:
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 ... {} \;