Ответы:
Просто напишите {}
два раза в вашей команде. Следующее будет работать:
$ echo test | xargs -I {} echo {} {}
test test
Ваша проблема в том, как команды вложены . Давайте посмотрим на это:
echo test | xargs -I {} echo {} && echo {}
Баш выполнит echo test | xargs -I {} echo {}
. Если он работает успешно, echo {}
выполняется. Чтобы изменить вложение, вы можете сделать что-то вроде этого:
echo test | xargs -I {} sh -c "echo {} && echo {}"
Тем не менее, вы можете получить проблемы, потому что подход может быть склонным к внедрению кода. Когда «тест» заменяется кодом оболочки, он выполняется. Следовательно, вам, вероятно, следует передать входные данные во вложенную оболочку с аргументами.
echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
$(rm -f *)
. Это лучше сделатьxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Другой вариант - использовать -i
флаг, который совпадает с -I{}
(подразумевается, что замена дается с помощью {}
):
$ echo test | xargs -i echo {} {}
This option is deprecated; use -I instead.
было добавлено руководство man xargs
.
У меня работает только нижний регистр. У меня были сотни изображений в каталоге, и я хотел получить их источники в список. -I
Вариант в верхнем регистре у меня не сработал. Только строчные. Вероятно, из-за различий в версии. У всех этих изображений были такие имена, как Daniel_(somenumber).jpg
.
Этот синтаксис сработал:
ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"
Возвращает:
src='Daniel_248.jpg' alt='Daniel_248.jpg'
...
Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
var=test & echo $var ...