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.2RHEL 6.3で実行しています。


2
興味深いことに、BSD xargsでは意図したとおりに機能しますが、GNUでは機能しませんxargs
slhck 2013

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 2013

GNU Parallelは良い代替品のように見えましたが、残念ながら、この特定のホストにインストールすることはできません。
アンドレ・フェルナンデス

@AndréFernandesoletange.blogspot.dk/2013/04/ why
Ole

回答:


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 DERP server3のDERP SERVER4
アンドレ・フェルナンデス

申し訳ありませんが、それをテストしました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「echos」の各文字「abcd」の中間的な使用。これにより、各文字は次のように独自の行に配置されます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.