xargs -I {} var = {} echo $ var && echo $ var Это даст вам: такого файла или каталога нет.
Ответы:
27
Просто напишите {}два раза в вашей команде. Следующее будет работать:
$ 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 {}
Обратите внимание , что вы получите неожиданные результаты в последнем коде , если вы AFile callod, буквально $(rm -f *). Это лучше сделатьxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Кусалананда
@Kusalananda, спасибо. Я знал о проблеме, но я не мог придумать простого решения в тот момент. Я включил ваше предложение в ответ.
JojOatXGME
5
Другой вариант - использовать -iфлаг, который совпадает с -I{}(подразумевается, что замена дается с помощью {}):
А пока: This option is deprecated; use -I instead.было добавлено руководство man xargs.
Джонатан Комар
0
У меня работает только нижний регистр. У меня были сотни изображений в каталоге, и я хотел получить их источники в список. -IВариант в верхнем регистре у меня не сработал. Только строчные. Вероятно, из-за различий в версии. У всех этих изображений были такие имена, как Daniel_(somenumber).jpg.
var=test & echo $var ...
Ответы:
Просто напишите
{}
два раза в вашей команде. Следующее будет работать:Ваша проблема в том, как команды вложены . Давайте посмотрим на это:
Баш выполнит
echo test | xargs -I {} echo {}
. Если он работает успешно,echo {}
выполняется. Чтобы изменить вложение, вы можете сделать что-то вроде этого:Тем не менее, вы можете получить проблемы, потому что подход может быть склонным к внедрению кода. Когда «тест» заменяется кодом оболочки, он выполняется. Следовательно, вам, вероятно, следует передать входные данные во вложенную оболочку с аргументами.
источник
$(rm -f *)
. Это лучше сделатьxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Другой вариант - использовать
-i
флаг, который совпадает с-I{}
(подразумевается, что замена дается с помощью{}
):источник
This option is deprecated; use -I instead.
было добавлено руководствоman xargs
.У меня работает только нижний регистр. У меня были сотни изображений в каталоге, и я хотел получить их источники в список.
-I
Вариант в верхнем регистре у меня не сработал. Только строчные. Вероятно, из-за различий в версии. У всех этих изображений были такие имена, какDaniel_(somenumber).jpg
.Этот синтаксис сработал:
Возвращает:
Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
источник