ファイルからの入力でxargsを使用する


41

次のファイルがあるとします

bob
john
sue

現在、これらの直接のような(この場合)URLパターンにcorrospond http://example.com/persons/bob.tarjohn.tarsue.tar

これらの線を使って、それらを実行したいxargsです。しかし、実行中のコマンドに何が渡されるのかわかりません。プロンプト(たとえば、各行を単にエコーするcat file | xargs echo $PARAM)またはbashスクリプトからパラメーターにアクセスするにはどうすればよいですか。


質問にはまったく従いません、ごめんなさい。特に、私は手段「私はかかわらず、実行中のコマンドに渡されるかわからない」はよく分からない
マイケルMrozek

1
@Michael:リストを実行すると、リストxargsが行ごとに分割され、各行がコマンドに入力されますよね?次のようなことを言う必要がある場合、どのようにアクセスしcat file | xargs curl http://example.com/[PASSED FROM FILE].tarますか?
ジョシュK

回答:


70

マイケルの答えは正しいので、問題を解決する必要があります。ランニング

cat file | xargs -I % curl http://example.com/persons/%.tar

bob.tar john.tar. sue.tar期待どおりにファイルをダウンロードします。

しかし猫はここに無用です

むしろ使用:

<file xargs -I % curl http://example.com/persons/%.tar

1
私の1つのファイルの例では、理想的ではないかもしれませんが、cat xaa xab xac xad ... xargs ...
ジョシュK

10
@Joshなんらかの理由で、人々はここで猫の不必要な使用を本当に真剣に考える傾向があります。私は今二回それをdownvotedしてきた
マイケルMrozek

2
記録のために、あなたは私から+1を得ました。catもっと情報を追加するのと同じように、使用は本当に素晴らしいと思います... :)
Stefan

確かにxargs -I % curl …(前のxargsオプションcurlとそのオプション/引数)であるべきです。少なくともxargs curl -I %(where -I %curlではなくxargsのオプションとして意図されています)は移植性がありません。
クリスジョンセン

@クリス、素敵なキャッチ、TNX。一定。
ステファン

16

xargs常に最後に貼り付けるのではなく、コマンドの途中でstdin から引き出された個々の行を挿入する方法を尋ねていると思います。その場合、-Iフラグはreplacement-string引数を取ります。xargs次にreplacement-string、コマンド内のstdinから読み取った行に置き換えます。

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

さて、どうcurl http://example.com/foobar.tar > foobar.tarですか?
ジョシュK

2
@Josh K:>はシェル構造であり、では機能しませんxargs。一方、curl -owgetがそうであるように、stdoutの代わりに名前付きファイルに書き込むので、おそらくここで使用したいでしょう。
一時的な

9
$ man xargs
...
       --arg-file = file
       -ファイル
              標準入力の代わりにファイルからアイテムを読み取ります。これを使うと
              オプション、コマンドの実行時にstdinは変更されません。その他
              賢明なことに、stdinは/ dev / nullからリダイレクトされます。
...

あなたは、設定することをお勧めします--delimiter=/ -d'\n'も同様に。


一方、ファイルの各行をURLに変換しようとしている場合は、

$ sed -e 's#。*#http://example.com/persons/&.tar#'ファイル

すべてを取得する場合は、それをにパイプします。| wget -i


8

シェルループの別の方法:

for i in `cat file`; do curl -I http://foo.com/$i; done

&最後のセミコロンの前に追加することにより、バックグラウンドで各反復を実行することもできます-非常に大きなダウンロードの場合、これは便利です


2
あなたは古典的な失敗の一つに落ちまし!<-リンク切れ、キャッシュバージョン:役に立たない猫賞の使用
ソルピガル

@SorpigalそのURLは壊れています。「Classic Blunder」とは何ですか?
starbeamrainbowlabs

@starbeamrainbowlabs-猫の役に立たない使用、私は上記のコメントにそのリンクのキャッシュされたバージョンを入れました。
slm

@starbeamrainbowlabs:私は、具体的にリンクされた危険なバッククォートが、あなたはしばらくの構造に変更した場合、猫の使用も不必要である:while IFS= read i ; do curl ... ; done < file
Sorpigal


1

while read VAR; do ... done ループはシンプルですが、非常に多用途です:

while read word; do wget http://example.com/persons/$word; done < file

0

これはStefan:sの回答のより一般的なバージョンですが、真ん中にawkを使用して、xargsに実行させたい正確な「文字列」を準備しています。そして、xargsはbashを使用して実際の「作業」を行っています。

この例では少しやり過ぎですが、いくつかの修正を加えることで多くの問題を解決できる一般的なソリューションです...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.