1

Обычно xargs связывает все вместе, но при использовании с флагом -I кажется, что все оценивается как одна строка. Значит ли это, что он теряет преимущество в скорости? Также, если используется синтаксис -exec cmd {} +, значит ли это, что он будет работать лучше, чем xargs -I?

1 ответ1

3

Краткий ответ - да".

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .