Обычно xargs
связывает все вместе, но при использовании с флагом -I
кажется, что все оценивается как одна строка. Значит ли это, что он теряет преимущество в скорости? Также, если используется синтаксис -exec cmd {}
+, значит ли это, что он будет работать лучше, чем xargs -I
?
1 ответ
Краткий ответ - да".
xargs -I{} cmd
допускает многократное вхождение указанной замещающей строки, но будет предоставлять только один элемент ввода при выполнении cmd
, что означает, что в следующем примере echo
будет вызываться три раза:
$ mkdir t
$ cd t
$ touch foo bar baz
$ find . -type f | xargs -I{} echo {} {}
./bar ./bar
./baz ./baz
./foo ./foo
Обратите внимание, что если вам не нужно указывать каждый элемент ввода более одного раза в командной строке, то find -exec cmd {} +
примерно эквивалентен find | xargs
(без -I
), за исключением того, что по умолчанию он обрабатывает имена файлов с пробелами (чтобы правильно обрабатывать встроенные пробелы с последними, используйте find -print0 | xargs -0
).
find -exec cmd {} +
передаст несколько элементов ввода в cmd
, но допускается только одно вхождение строки замены ({}
). Это также поведение по умолчанию для xargs
без -I
. В следующем примере echo
вызывается только один раз для каждого набора аргументов (для больших входных наборов оба подхода разбивают ввод на куски так, что каждая сгенерированная командная строка короче PATH_MAX
, что означает, что cmd
может быть вызван несколько раз, но далеко менее одного раза на элемент ввода):
$ find . -type f -exec echo {} +
./bar ./baz ./foo
$ find . -type f | xargs echo
./bar ./baz ./foo