14

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

ls | xargs rm

ls | xargs -i{} rm {}

Оба работают на меня

3 ответа3

12

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, чтобы получить больше информации об этом.

2

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

сравнить

ls | xargs echo

а также

ls | xargs -i echo '{}'
1

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

ls | xargs -iPLACEHOLDER echo PLACEHOLDER

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

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