Насколько я понимаю, следующее должно означать то же самое:
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 {}, пропуски в именах файлов обрабатываются как и ожидалось.
xargs file
илиxargs -I{} file {}
. Не должно бытьxargs file {}
. Я предполагаю, что при явном указании -I {} bash будет воспринимать это какfile "Hello World"
. Без -I {} это рассматривается какfile Hello World
.-1
опциюls
, но она включена по умолчанию, когда выводомls
является файл или канал, поэтому вам здесь это не нужно. (3) Вы путаете-I
с устаревшей опцией-i
(в нижнем регистреI
).-ifoo
эквивалентно-Ifoo
, но обычный-i
эквивалентно-I{}
. Но используйте-I{}
. (4) Если вы действительно хотите делать то, что говорите, то почему бы просто не сказатьfile *
?file
их. Но я придумал более простой пример использованияls
. Вы правы. За этоfile *
самое лучшее.-exec
.Ответы:
-I
Требует определенного заполнителя.-i
Вариант будет предполагать ,{}
является заполнителем. Именно здесь я нашел предположение {},man xargs
по крайней мере, в Cygwin и CentOS.Вызванный xargs без какой-либо опции не нуждается в заполнителе, и он просто добавляет STDIN в конец аргументов.
Просто добавьте
echo
к своим примерам, чтобы увидеть, что делает xargs:Ваш пример по ошибке использует
{}
:поэтому
file
cmd видит аргументы{} Hello World
и ошибки.Если вы хотите явно использовать
{}
в вашем вызове xargs:Или без заполнителя:
Xargs, как указано выше, не нуждается в {}. Он добавляет STDIN в конец команды без заполнителя. Использование {} обычно означает, что вы хотите, чтобы STDIN где-то в середине cmd выполнялся, как в:
источник