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

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

我尝试使用 xargs 为每个提供的参数运行一个命令,但不幸的是,--replace/-I 标志与 -n 结合时似乎无法正常工作。似乎无论 -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 上运行。

答案1

您可以使用换行符来获得预期结果。对于您的服务器扩展,结果如下:

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

答案2

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

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

由于使用了“-n1”选项,xargs 的中间用法会分别“回显”每个字母“abc d”。这会将每个字母放在自己的行上,如下所示,

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

重要的是要理解,使用 -I(字符串替换)时,xargs 隐含 -L,它会每行执行一次实用程序命令(在您的例子中是 echo)。此外,您不能将 -n 与 -L 一起使用,因为它们是互斥的。

相关内容