Что означает {} + в команде find's -exec?

23

Я хочу знать , смысл {} +в execкоманде, и в чем разница между {} +и {} \;. Чтобы быть точным, в чем разница между этими двумя:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Мохсен
источник
5
Он описан man find(1)очень подробно, и его легко найти любому. Не ленись.
Мирослав Кошкар
Спасибо дорогой Мирослав, я искал в man exec!
Ах, я никогда не сталкивался с {} +использованием раньше. Я обычно использую xargs для этого (и часто find ... -print0 | xargs -0 ...)

Ответы:

27

Использование ;(точка с запятой) или +(знак плюс) обязательно для завершения команд оболочки, вызванных -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
    

    Командная строка строится путем добавления каждого выбранного имени файла в конце.

    Только один экземпляр {}допускается в команде.

Смотрите также:

kenorb
источник
Там является разница и главный. См. User1116056 ответ
Джахид
24

Учитывая, что команда 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
user1116056
источник
5

Согласно man find:

-exec command {} + Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.

BE77Y
источник