Мне интересно знать, какая разница между использованием +
и ;
в конце -exec
команды, когда я использую в find
команде?
find .... -exec ... \;
В.С.
find .... -exec ... +
-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]...
означает, что он может занять более одного файла.
+
может использоваться только для отдельных команд, и вы должны иметь ровно одну {}
в строке. \;
может работать с несколькими группами от нуля до многих.
\;
, выполненная команда будетcat 1; cat 2; cat 3
. С+
, выполненная команда будетcat 1 2 3
.+
это не POSIX, поэтому может быть недоступно в системах, отличных от Linux. Не беспокойтесь, если вы никогда не покинете платформу, но полезно знать, нужно ли вам когда-либо использовать Solaris. :)-exec <command> {} ';'
потому что мне легче печатать (я могу касаться шрифта, но у меня точно нет лучшего метода).-exec ... {} +
это POSIX. См .: pubs.opengroup.org/onlinepubs/9699919799/utilities/…-exec ... {} +
Расширение было предложено для включения в спецификации POSIX в 2001 году и ратифицировано в выпуске 6 POSIX в 2004 году. Возможно, версия Solaris, к которой вы привыкли, старше, чем этот стандарт POSIX (или просто предназначена для более ранней версии).