Подтвердить что ты не робот

Find -name "*.xyz" -o -name "*.abc" -exec выполнить Execute для всех найденных файлов, а не только последний суффикс, указанный

Я пытаюсь запустить

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to

В действительности это больший список расширений имен, но я не знаю, что имеет значение для этого примера. В основном я хотел бы скопировать все найденные в другой /path/i/want/to/copy/to. Однако, похоже, это только выполнение теста last -name в списке.

Если я удаляю часть -exec, все распечатки файлов, которые я ожидаю найти, распечатываются.

Как мне получить полный список файлов, найденных в -exec?

4b9b3361

Ответ 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 \;

Ответ 2

Более удобным, чем решение Jaypal, может быть:

   find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to

Ответ 3

find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;

Ответ 4

Это может сработать:

find ./ -name "*.{xyz,abc}" -exec cp {} /path/i/want/to/copy/to