-exec command ;
Строка `{} 'заменяется текущим именем обрабатываемого файла.Рассмотрим следующее:
% find . -type f
./file1
./file2
./file3
./file4
./file5
% find . -type f -exec sh -c 'printf "arg -> %s\n" "$0"' {} \;
arg -> ./file1
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5
Но здесь мы выполняем sh -c ...
для каждого найденного файла.Также обратите внимание, что имя файла передается в оболочку как $ 0 (не $ 1 ).
Если мы хотим оптимизировать код, пока наша команда принимает большечем один аргумент за раз, мы могли бы использовать что-то вроде этого:
% find . -type f -exec sh -c 'printf "arg -> %s\n" "$@"' {} +
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5
Обратите внимание на синтаксис {} + (против {} \;).Из найдите справочных страниц:
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line
is built by appending each selected file name at the end; the total number of invocations of the com-
mand will be much less than the number of matched files. The command line is built in much the same
way that xargs builds its command lines.
Но, как вы заметили, первый файл отсутствует (потому что $ @ содержит все параметры, кроме$ 0).Вот почему нам нужно установить наши $ 0 вручную, чтобы правильно обработать все аргументы:
% find . -type f -exec sh -c 'printf "arg -> %s\n" "$@"' put_whatever_you_want_here {} +
arg -> ./file1
arg -> ./file2
arg -> ./file3
arg -> ./file4
arg -> ./file5
В некоторых ситуациях вам может потребоваться установить $ 0 на что-то значимое.