xargs --replace / -I用于单个参数


10

我正在尝试使用xargs为每个提供的参数运行命令,但是不幸的是,当与-n共轭时,--replace / -I标志似乎无法正常工作。不论-n选项如何,{}似乎都会扩展到从stdin读取的参数的完整列表。

不幸的是,网络上的所有示例似乎都是针对命令(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 xargson -IAlso, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.因此其行为符合设计要求。
丹尼尔·贝克

@André,由于您打算并行运行taks,因此您是否了解过GNU parallel?它做得很好。免责声明:我将其打包为Debian。
rbrito

GNU parallel似乎是一个很好的替代品,但是不幸的是我无法在特定的主机上安装它。
安德烈·费尔南德斯

Answers:


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 {}回波DERP {} DERP server1的DERP服务器2服务器3 DERP DERP服务器4
安德烈费尔南德斯

抱歉,用zsh... 测试了它。echo需要-e选项。
ahilsend 2013年

2

您可以像这样利用额外的管道,

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

由于使用-n1选项,因此xargs的中间用法分别将每个字母abcd用作echos。这样将每个字母放在自己的行上,

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

了解使用-I(字符串替换)时的重要性,xargs暗示-L,它每行执行一次实用程序命令(在您的情况下为echo)。另外,不能将-n与-L一起使用,因为它们是互斥的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.