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