GNU/Linux >> Linux の 問題 >  >> Linux

Curl コマンド ライン ユーティリティを使用した並列ダウンロード

さて、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}

Linux
  1. youtube-dlを使用してLinuxコマンドラインでYouTubeビデオをダウンロードする

  2. コマンドラインを使用してLinuxをシャットダウンまたは再起動する方法

  3. Linuxのコマンドラインからファイルをダウンロードする

  1. wget コマンドを使用してコマンド ラインからファイルをダウンロードするにはどうすればよいですか?

  2. Linux コマンドラインを使用して Node.JS をアンインストールしますか?

  3. Linux で数値の統計を出力するコマンド ライン ユーティリティ

  1. Linuxコマンドラインで力を使用する

  2. Ubuntu20.04システムのコマンドラインを使用してUbuntuにファイルをダウンロードする

  3. Ubuntu:curl を使用してイメージをダウンロードする