14

Насколько я понимаю, следующее должно означать то же самое:

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

если опция -I не указана, по умолчанию используется -I {}.

Я хочу вывести список всех файлов в текущем каталоге и запустить команду file для каждого из них. У некоторых есть пробелы в их именах. Однако я заметил разницу. Увидеть ниже:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

Если явно указано -I {}, пропуски в именах файлов обрабатываются как и ожидалось.

1 ответ1

17

-I требует определенного заполнителя. Опция -i предполагает, что {} является заполнителем. Именно здесь я нашел предположение {} в man xargs по крайней мере, в Cygwin и CentOS.

xargs, вызываемый без какой-либо опции, не нуждается в заполнителе, и он просто добавляет STDIN в конец аргументов.

Просто добавьте echo в ваши примеры, чтобы увидеть, что делает xargs:

$ ls -1
Hello World/

В вашем примере по ошибке используется {}:

$ ls -1 | xargs echo file {}
file {} Hello World/

поэтому file cmd видит аргументы {} Hello World и ошибки.

Если вы хотите явно использовать {} в вашем вызове xargs:

$ ls -1 | xargs -i echo file {}
file Hello World/

Или без заполнителя:

$ ls -1 | xargs echo file
file Hello World/

Xargs, как указано выше, не нуждается в {}. Он добавляет STDIN в конец команды без заполнителя. Использование {} обычно означает, что вы хотите, чтобы STDIN где-то в середине cmd выполнялся, как в:

$ ls -1 | xargs -i mv {} /path/to/someplace/.

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