В чем разница между использованием «+» (плюс) и «;» (точка с запятой) в команде -exec?

28

Мне интересно знать, какая разница между использованием +и ;в конце -execкоманды, когда я использую в findкоманде?

find .... -exec ... \; 

В.С.

find .... -exec ... + 
αғsнιη
источник

Ответы:

36

-exec ... \;будет запускать один элемент за другим. Таким образом, если у вас есть три файла, строка exec будет запущена три раза.

-exec ... {} +для команд , которые могут иметь более одного файла одновременно (например cat, stat, ls). Найденные файлы findсвязаны друг с другом как xargsкоманда. Это означает, что меньшее количество разветвлений и небольших операций может означать значительное ускорение.

Вот демонстрация производительности с 10 000 пустых файлов.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Опять же, это работает только для команд, которые могут принимать несколько имен файлов. Вы можете разобраться, если ваша команда такая, посмотрев ее справочную страницу. Вот краткий обзор от man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

Многоточие на [FILE]...означает, что он может занять более одного файла.

+может использоваться только для отдельных команд, и вы должны иметь ровно одну {}в строке. \;может работать с несколькими группами от нуля до многих.

Оли
источник
4
Пример: с \;, выполненная команда будет cat 1; cat 2; cat 3. С +, выполненная команда будет cat 1 2 3.
Алаа Али
AFAIK, +это не POSIX, поэтому может быть недоступно в системах, отличных от Linux. Не беспокойтесь, если вы никогда не покинете платформу, но полезно знать, нужно ли вам когда-либо использовать Solaris. :)
Саймон Рихтер
О, хорошо, спасибо за информацию. Я, как правило, -exec <command> {} ';'потому что мне легче печатать (я могу касаться шрифта, но у меня точно нет лучшего метода).
Hanetzer
2
@SimonRichter: Нет, -exec ... {} +это POSIX. См .: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter -exec ... {} +Расширение было предложено для включения в спецификации POSIX в 2001 году и ратифицировано в выпуске 6 POSIX в 2004 году. Возможно, версия Solaris, к которой вы привыкли, старше, чем этот стандарт POSIX (или просто предназначена для более ранней версии).
Оли