Я хочу знать , смысл {} +
в exec
команде, и в чем разница между {} +
и {} \;
. Чтобы быть точным, в чем разница между этими двумя:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Я хочу знать , смысл {} +
в exec
команде, и в чем разница между {} +
и {} \;
. Чтобы быть точным, в чем разница между этими двумя:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Ответы:
Использование ;
(точка с запятой) или +
(знак плюс) обязательно для завершения команд оболочки, вызванных -exec
/ execdir
.
Разница между ;
(точка с запятой) или +
(знак плюс) заключается в том, как аргументы передаются в параметр find -exec
/ -execdir
. Например:
Использование ;
будет выполнять несколько команд (отдельно для каждого аргумента),
Пример:
$ find /etc/rc* -exec echo Arg: {} ';'
Arg: /etc/rc.common
Arg: /etc/rc.common~previous
Arg: /etc/rc.local
Arg: /etc/rc.netboot
Все последующие аргументы для
find
принимаются в качестве аргументов команды.Строка
{}
заменяется текущим именем обрабатываемого файла.
using +
выполнит наименьшее количество возможных команд (так как аргументы объединены вместе). Это очень похоже на то, как xargs
работает команда, поэтому она будет использовать как можно больше аргументов для каждой команды, чтобы избежать превышения максимального лимита аргументов в строке.
Пример:
$ find /etc/rc* -exec echo Arg: {} '+'
Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
Командная строка строится путем добавления каждого выбранного имени файла в конце.
Только один экземпляр
{}
допускается в команде.
Смотрите также:
Учитывая, что команда find попадает ниже трех файлов:
fileA
fileB
fileC
Если вы используете -exec
со +
знаком плюс ( ),
find . -type f -exec chmod 775 {} +
это будет:
chmod 775 fileA fileB fileC
Командная строка создается путем добавления каждого совпадающего имени файла в конце, что аналогично xargs
построению его командных строк. Общее количество вызовов команды ( chmod
в данном случае) будет намного меньше, чем количество подходящих файлов.
Если вы используете -exec
с точкой с запятой ( ;
),
find . -type f -exec chmod 775 {} \;
это будет:
chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
Согласно man find
:
-exec command {} + Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.
man find(1)
очень подробно, и его легко найти любому. Не ленись.