web-dev-qa-db-ja.com

xargs --replace /-単一の引数の場合はI

Xargsを使用して、指定された引数ごとにコマンドを実行しようとしていますが、残念ながら、-nと結合すると--replace/-Iフラグが正しく機能しないようです。 {}は、-nオプションに関係なく、stdinから読み取られた引数の完全なリストに展開されるようです。

残念ながら、Web上のすべての例は、{}が展開されている場所で複数の引数を取るコマンド(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'
_

RHEL6.3でxargs (GNU findutils) 4.4.2を実行しています。

10

期待される結果を達成するために改行でエコーすることができます。サーバー拡張の場合、次のようになります。

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

あなたはこのような余分なパイプを利用することができます、

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

'-n1'オプションのため、xargs'echos '各文字' a b cd 'を個別に中間的に使用します。これにより、各文字が次のように独自の行に配置されます。

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

-I(文字列置換)を使用する場合、xargsは-Lを意味することを理解することが重要です。これは、ユーティリティコマンド(この場合はecho)を1行に1回実行します。また、-nと-Lは相互に排他的であるため、使用できません。

2
synergy77