巨大ファイルの継続ダウンロード
ISOファイルやSDKなど巨大ファイルのダウンロードが必要な場面がある。Webブラウザーでダウンロードすると途中で途切れてしまうことがある。
そこで,巨大ファイルを継続ダウンロードする方法を整理した。結論としては,wgetコマンドとcurlコマンドに以下のオプションを指定して実行すればよい。
wget -ct 0 --retry-connrefused URL
curl -OC - --retry 999 --retry-connrefused --retry-max-time 0 URL
導入
コマンドラインからのファイルダウンロードにはcurl
とwget
コマンドがよく使われる。しかし,何のオプションも付けずにこれらのコマンドで巨大ファイルをダウンロードすると,以下のエラーが発生して中断することがある。
こちらの通信状況が良くても,ダウンロード元のサーバーから切断されてしまうこともある。
そこで,これらの切断時にも継続してダウンロードできるように,wgetとcurlのオプションを指定する (参考: mac – Persistent retrying resuming downloads with curl – Super User)。
ポイントは以下の3点だ。
wget
とcurl
のそれぞれのコマンドのオプションを解説していく。
wget
wget
コマンドでは以下のコマンドで巨大ファイルを継続してダウンロードできる。
wget -ct 0 --retry-connrefused URL
指定しているオプションは以下の通りとなる。
オプション | 説明 |
---|---|
-c/--continue | 前回のダウンロードファイルの続きからダウンロード。 |
-t <num>/--tries=<num> | 接続の切断時の再試行回数。デフォルトは20。0を指定すると無限に再試行する。ただし,”connectioon refused”や”note found”などの致命的なエラーの場合は再試行しない。 |
--retry-connrefused | “connection refused” の場合でも接続を再試行する。 |
wget
では指定したオプション全てが継続ダウンロードに必須となる。
curl
curl
コマンドでは以下のコマンドで巨大ファイルを継続してダウンロードできる。
curl -OC - --retry 999 --retry-connrefused --retry-max-time 0 URL
指定しているオプションは以下の通りとなる。
オプション | 説明 |
---|---|
-O/--remote-name | URLからダウンロードファイル名を取得する。 |
-C <offset>/--continue-at <offset> | 指定した<offset>で全体のファイル転送を継続する。オフセットに- を指定すると,前回のファイルから継続する。 |
--retry <num> | 接続の切断時の再試行回数。デフォルトは0。wgetと異なり0を指定しても無限にはならない。 |
--retry-max-time <seconds> | --retry での再試行のタイムアウトタイマー。0を指定すると再試行はタイムアウトしない。 |
--retry-connrefused | --retry のために,”connection refused” (ECONNREFUSED) の場合もエラーとみなす。--retry とセットで使う。 |
-O
以外は必須のオプションとなる。wget
と異なり,再試行のオプション--retry
で試行回数を明示的に指定する必要があるところに注意が必要だ。999
など大きな値を指定しておけばいいだろう。それ以外は概ね同じだ。
wget
/curl
共通
当初,wgetやcurlの再試行用のオプションを知らなかったため,以下のコマンドで継続ダウンロードしていた。
until curl -OC - URL; do :; done
until wget -c URL; do :; done
until文でwgetやcurlコマンドの実行が成功するまで処理を反復させ,反復の本体は構文エラーの防止のために何もしない:
コマンドを実行する。
この方法でもファイルの継続ダウンロードができる。コマンドのバージョンが古くて,万が一オプションが対応していない場合に出番がくるかもしれない。
結論
wget
コマンドとcurl
コマンドによる巨大ファイルの継続ダウンロード方法を整理した。
ISOやAndroid,GUI開発などではSDKやバイナリーファイルなど巨大なファイルをダウンロードすることはそれなりに発生する。自宅の細い回線だとダウンロードだけで何時間もかかってしまう。
そういうときに,今回の継続ダウンロードコマンドを並べたシェルスクリプトを夜間に実行することで,時間をうまく使うことができる。
今回はLinuxに標準で用意されているwget
コマンドとcurl
コマンドでの方法を整理した。WindowsにもbitsadminコマンドやPowerShellのcurlコマンドでも似たようなことができるだろう。必要になったタイミングでこちらの記事に追加したい。