Синтаксис:
find ... -exec cmd {} +
find
найдет несколько файлов, основанных на критериях, ...
и запустит cmd
этот список путей к файлам в качестве аргументов, насколько это возможно, без превышения ограничения на размер аргументов для команды.
При необходимости он может разбить список файлов и вызвать cmd
несколько раз. Например, это может в конечном итоге вызвать:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Ограничение в том, что {}
это должно быть последним. Вы не можете, например, написать:
find ... -exec cmd {} other args +
как вы могли бы ';'
вместо '+'
.
Ты можешь написать:
find ... -exec echo foo {} +
но нет:
find ... -exec echo {} foo +
Итак, если вам нужно добавить несколько дополнительных аргументов cmd
после списка файлов, вам придется прибегнуть к вызову оболочки. (Другими причинами, по которым вам нужно вызывать оболочку, может быть любое время, когда вам нужно использовать такую функцию оболочки, как перенаправления, каналы, некоторые расширения строк ....)
В sh -c 'inline-script' x a b c
, поскольку inline-script
, $0
есть x
, $1
есть a
, $2
есть b
... так же, "$@"
как и список этих трех аргументов: a, b и c. Итак, в:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Для встроенного скрипта , $0
(который используется, например , при отображении сообщений об ошибках) установлен в find-sh
и "$@"
список файлов (что find
расширяет {}
к).
Используя exec
специальную встроенную оболочку:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Мы говорим оболочке не форкать дополнительный процесс для запуска cmd
, а вместо этого запускать его в том же процессе (заменяя запущенный процесс оболочки этой командой). Некоторые оболочки любят bash
, zsh
а некоторые реализации ksh
делают это неявно для последней команды в скрипте.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?