В чем разница между xargs с фигурными скобками и без них в Linux?

В чем разница между xargs с фигурными скобками и без них в Linux?

Я хочу знать, в чем разница между этим

ls | xargs rm
ls | xargs -i{} rm {}

Оба варианта мне подходят.

решение1

xargs rmбудет вызван rmсо всеми аргументами, так как параметр отделен пробелами.

xargs -i{} rm {}будет вызван rm {}для каждого аргумента и {}будет заменен текущим аргументом.

Если у вас есть 2 аргумента a.txtи b.txt, xargs rm вызовем это

rm a.txt b.txt

Но xargs -i{} rm {}позвоню

rm a.txt
rm b.txt

Это потому, что -ioption подразумевает -L 1option, что означает, что команда rmбудет принимать только 1строку каждый раз. А здесь каждая строка содержит только 1 аргумент.

Проверь этоИдеон ссылкачтобы получить больше информации об этом.

решение2

-ioption (эквивалентно --replace) создает своего рода заполнитель, где xargs сохраняет только что полученные входные данные. Во второй команде заполнитель — {}, он работает как find -execoption. После определения xargs заменит этот заполнитель на всю строку ввода. Если вам не нравится имя {}, вы можете определить свое собственное:

ls | xargs  -iPLACEHOLDER echo PLACEHOLDER

В вашем случае обе команды дают одинаковый результат. Во второй форме вы просто делаете явным поведение по умолчанию с помощью опции -I.

решение3

С фигурными скобками он будет порождать один rmпроцесс на файл. Без фигурных скобок xargsбудет передавать как можно больше имен файлов каждой rmкоманде.

Сравнивать

ls | xargs echo

и

ls | xargs -I {} echo {}

Связанный контент