さて、curl
単純な UNIX プロセスです。これらの curl
をいくつでも持つことができます プロセスは並行して実行され、その出力を異なるファイルに送信します。
curl
URL のファイル名部分を使用して、ローカル ファイルを生成できます。 -O
を使用するだけです オプション (man curl
詳細はこちら)
次のようなものを使用できます
urls="http://example.com/?page1.html http://example.com?page2.html" # add more URLs here
for url in $urls; do
# run the curl job in the background so we can start another job
# and disable the progress bar (-s)
echo "fetching $url"
curl $url -O -s &
done
wait #wait for all background jobs to terminate
私の答えは少し遅れていますが、既存の答えはすべて少し足りないと思います。このようなことを行う方法は xargs
です 、サブプロセスで指定された数のコマンドを実行できます。
私が使用するワンライナーは、単純に次のとおりです。
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
これには説明が必要です。 -n 1
の使用 xargs
を指示します 一度に 1 つの入力引数を処理します。この例では、数値 1 ... 10
それぞれ別々に処理されます。そして -P 2
xargs
に伝えます すべての入力引数が処理されるまで、それぞれが単一の引数を処理する 2 つのサブプロセスを常に実行し続けるため。
これは、シェルの MapReduce と考えることができます。または、おそらくマップ フェーズだけです。いずれにせよ、これは、マシンをフォーク爆撃しないようにしながら、多くの作業を完了するための効果的な方法です。シェルの for ループで同様のことを行うことは可能ですが、最終的にプロセス管理を行うことになります。これは、この xargs
の使用がどれほど非常に優れているかを理解すると、かなり無意味に思え始めます。
更新:xargs
を使用した私の例が疑わしい 改善される可能性があります (少なくとも Mac OS X と BSD では -J
国旗)。 GNU Parallel を使用すると、コマンドの扱いも少し楽になります:
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}