find -name "* .xyz" -o -name "* .abc" -exec для выполнения всех найденных файлов, а не только последнего указанного суффикса - PullRequest
40 голосов
/ 17 января 2012

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

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

На самом деле это большой список расширений имен, но я не знаю, что имеет значение для этого примера. По сути, я хотел бы скопировать все найденные в другой / путь / я / хочу / в / копировать / в. Однако, похоже, он выполняет только тест с последним именем в списке.

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

Как мне передать полный набор найденных файлов в -exec?

Ответы [ 4 ]

54 голосов
/ 17 января 2012

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 \;
16 голосов
/ 17 января 2012

Может быть более пригодным для использования, чем решение Jaypal:

   find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to
8 голосов
/ 17 января 2012
find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;
0 голосов
/ 17 января 2012

Может работать:

find ./ -name "*.{xyz,abc}" -exec cp {} /path/i/want/to/copy/to
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...