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で実行しています。
man xargs
on -I
:Also, 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 2013
GNU Parallelは良い代替品のように見えましたが、残念ながら、この特定のホストにインストールすることはできません。
—
アンドレ・フェルナンデス
xargs
では意図したとおりに機能しますが、GNUでは機能しませんxargs
。