web-dev-qa-db-ja.com

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

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

bob
john
sue

これらは、(この場合は)http://example.com/persons/bob.tarjohn.tarsue.tarなどのURLパターンに直接対応しています。

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

44
Josh K

Michaelの answer は正しいです。問題を解決してください。ランニング

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

ファイルをダウンロードしますbob.tarjohn.tar.sue.tar 予想通り。

[〜#〜] but [〜#〜]ここの猫は役に立たない

むしろ使用:

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

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

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
アイテムを読み取ります標準入力の代わりにファイルから。この
オプションを使用すると、コマンドを実行してもstdinは変更されません。その他-
賢明には、stdinは/ dev/nullからリダイレクトされます。
 ... 

--delimiter=/-d'\n'に設定することもできます。


一方、ファイルの各行をURLに変換するだけの場合は、

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

すべてをフェッチしたい場合は、それを| wget -iにパイプするだけです。

9
ephemient

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

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

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

8
Brad Clawsie

GNU Parallelを使用すると、次のことができます。

cat urls | parallel curl {} ">" {/}

または:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

GNU Parallelの紹介ビデオをご覧ください:詳細は http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

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

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

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

この例では少しやりすぎですが、いくつかの変更を加えることで多くの問題を解決できる一般的な解決策です...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan