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