xargs - замінити / -я для окремих аргументів


10

Я намагаюся використовувати xargs для запуску команди для кожного поданого аргументу, але, на жаль, прапор --replace / -I, здається, не працює належним чином, коли поєднується з -n. Здається, що {} розшириться до повного списку аргументів, прочитаних із stdin, незалежно від параметра -n.

На жаль, всі приклади в Інтернеті, здається, є для команд (mv, cp, rm), які приймуть кілька аргументів, де {} розгорнуто.

Наприклад, під час запуску:

echo a b c d | xargs -n 1 -I {} echo derp {}

Вихід:

derp a b c d

Але я очікував:

derp a
derp b
derp c
derp d

Однак запуск без -I {} дає очікуваний результат:

echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d

Чи є спосіб досягти цього за допомогою xargs? Моє остаточне намір - використовувати його для запуску декількох (паралельних) сеансів ssh, наприклад

echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'

Я біжу xargs (GNU findutils) 4.4.2на RHEL 6.3.


2
Цікаво, що це працює так, як ви плануєте з BSD xargs, але не GNU xargs.
slhck

1
man xargsна -I: Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.Отже, він поводиться так, як задумано.
Даніель Бек

@ André, оскільки ви маєте намір паралельно запускати такси, ви подивилися паралель GNU? Це добре виконує роботу. Відмова: Я пакую його для Debian.
rbrito

Паралель GNU здавалася гарною заміною, але, на жаль, я не можу встановити його саме на цьому хості.
Андре Фернандес

@ AndréFernandes Чи можете ви уточнити, якщо ваші причини не охоплені oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html
Ole Tange

Відповіді:


5

Ви можете перегукуватися з новими рядками, щоб досягти очікуваного результату. У вашому випадку з розширенням сервера було б:

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4

Ідея нового рядка вирішує проблему (тільки не з вашим точним прикладом): echo server {1..4} | tr '' '\ n' | xargs -I {} echo derp {} derp server1 derp server2 derp server3 derp server4
André Fernandes

Вибачте, перевірив це за допомогою zsh... Виправлена ​​моя відповідь. echoпотрібен -eваріант.
ахільсенд

2

Ви можете використовувати додаткову трубу, як це,

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

Проміжне використання xargs 'echos' кожна буква 'abcd' окремо через опцію '-n1'. Це ставить кожну букву в такий же рядок,

echo a b c d | xargs -n1
a
b
c
d 

Важливо розуміти, коли використовується -I (заміна рядка), xargs має на увазі -L, який виконує команду утиліти (у вашому випадку відлуння) один раз у рядку. Крім того, ви не можете використовувати -n з -L, оскільки вони взаємовиключні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.