От man find
:
-exec команда;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска принимаются в качестве аргументов команды до аргумента, состоящего из ';' встречается. Строка '{}' заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find. Обе эти конструкции, возможно, должны быть экранированы (с '\') или заключены в кавычки, чтобы защитить их от расширения оболочкой. Смотрите секцию EXAMPLES sec для примеров использования опции '-exec'. Указанная команда запускается один раз для каждого соответствующего файла.
Команда выполняется в начальном каталоге. Существуют неизбежные проблемы безопасности, связанные с использованием параметра -exec;
-exec команда {} +
Этот вариант опции -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце ; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится во многом так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.
Итак, насколько я понимаю, \;
выполняет отдельную команду для каждого найденного файла find
, в то \+
время как добавляет файлы и выполняет одну команду для всех из них. Это \
побег, так что это:
ls testdir1; ls testdir2
против
ls testdir1 testdir2
Выполнение вышеизложенного в моей оболочке отражало вывод вашего вопроса.
пример того, когда вы хотели бы использовать \+
Предположим, два файла, 1.tmp
и 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
С участием \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Принимая во внимание, что если вы используете \+
(для объединения результатовfind
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Так что в этом случае это разница между diff 1.tmp; diff 2.tmp
иdiff 1.tmp 2.tmp
Есть случаи, когда \;
это уместно и \+
будет необходимо. Использование \+
with rm
является одним из таких примеров, когда при удалении большого количества файлов производительность (скорость) будет выше \;
.