find
работает, оценивая выражения, которые вы даете ему, до тех пор, пока он не сможет определить истинное значение (true или false) всего выражения. В вашем случае вы, по сути, делаете следующее, так как по умолчанию это И выражения вместе.
-name "*.xyz" OR ( -name "*.abc" AND -exec ... )
Quoth the man page:
GNU найти поиски
дерево каталогов коренится в каждом заданном имени файла, оценивая
данное выражение слева направо, в соответствии с правилами приоритета (см. раздел ОПЕРАТОРЫ), пока результат не известен (слева
сторона стороны ложна для и операций, верно для или), в какой момент
команда find переходит к следующему имени файла.
Это означает, что если имя совпадает с *.xyz
, оно даже не будет пытаться проверить последний -name
тест или -exec
, поскольку это уже верно.
То, что вы хотите сделать, это установить приоритет, что вы можете сделать с помощью скобок. Досадно, что вам также нужно использовать обратную косую черту, чтобы избежать их на оболочке:
find ./ \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;