Я хочу знать, в чем разница между этим
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
Это потому, что -i
option подразумевает -L 1
option, что означает, что команда rm
будет принимать только 1
строку каждый раз. А здесь каждая строка содержит только 1 аргумент.
Проверь этоИдеон ссылкачтобы получить больше информации об этом.
решение2
-i
option (эквивалентно --replace
) создает своего рода заполнитель, где xargs сохраняет только что полученные входные данные. Во второй команде заполнитель — {}
, он работает как find -exec
option. После определения xargs заменит этот заполнитель на всю строку ввода. Если вам не нравится имя {}
, вы можете определить свое собственное:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
В вашем случае обе команды дают одинаковый результат. Во второй форме вы просто делаете явным поведение по умолчанию с помощью опции -I
.
решение3
С фигурными скобками он будет порождать один rm
процесс на файл. Без фигурных скобок xargs
будет передавать как можно больше имен файлов каждой rm
команде.
Сравнивать
ls | xargs echo
и
ls | xargs -I {} echo {}