次のようなファイルがあるとします
bob
john
sue
これらは、(この場合は)http://example.com/persons/bob.tar
、john.tar
、sue.tar
などのURLパターンに直接対応しています。
これらの行を取り、xargs
を介して実行します。実行中のコマンドに何が渡されるのかわかりません。プロンプト(cat file | xargs echo $PARAM
などの各行を単純にエコーしたい場合)またはbashスクリプトからパラメーターにアクセスするにはどうすればよいですか。
Michaelの answer は正しいです。問題を解決してください。ランニング
cat file | xargs -I % curl http://example.com/persons/%.tar
ファイルをダウンロードしますbob.tar
john.tar.
sue.tar
予想通り。
[〜#〜] but [〜#〜]: ここの猫は役に立たない
むしろ使用:
<file xargs -I % curl http://example.com/persons/%.tar
xargs
'stdinから引き出された個々の行を、常に最後に貼り付けるのではなく、コマンドの途中に挿入する方法を尋ねていると思います。その場合、-I
フラグはreplacement-string
引数を取ります。 xargs
は、コマンドのreplacement-string
をstdinから読み取った行に置き換えます。
$ cat file | xargs -I foobar curl http://example.com/foobar.tar
$ 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
にパイプするだけです。
シェルループの別の方法:
for i in `cat file`; do curl -I http://foo.com/$i; done
最後のセミコロンの前に&
を追加することで、各反復をバックグラウンドで実行することもできます-非常に大きなダウンロードの場合、これは便利です。
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
while read VAR; do ... done
ループはシンプルですが、非常に用途が広いです:
while read Word; do wget http://example.com/persons/$Word; done < file
これはStefan:sの回答のより一般的なバージョンですが、xargsに実行させたい正確な「文字列」を準備するために途中でawkを使用しています。そして、xargsは実際の「作業」を行うためにbashを使用しています。
この例では少しやりすぎですが、いくつかの変更を加えることで多くの問題を解決できる一般的な解決策です...
cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c