巨大ファイルの継続ダウンロード

ISOファイルやSDKなど巨大ファイルのダウンロードが必要な場面がある。Webブラウザーでダウンロードすると途中で途切れてしまうことがある。

そこで,巨大ファイルを継続ダウンロードする方法を整理した。結論としては,wgetコマンドとcurlコマンドに以下のオプションを指定して実行すればよい。

wget -ct 0 --retry-connrefused URL
curl -OC - --retry 999 --retry-connrefused --retry-max-time 0 URL

導入

コマンドラインからのファイルダウンロードにはcurlwgetコマンドがよく使われる。しかし,何のオプションも付けずにこれらのコマンドで巨大ファイルをダウンロードすると,以下のエラーが発生して中断することがある。

wgetコマンドでのダウンロード失敗例
g4bl7wv9.default.zi  34%[+++++>              ]  29.83M   222KB/s    in 69s     

2020-02-26 16:20:50 (113 KB/s) - Connection closed at byte 31274845. Retrying.
curlコマンドでのダウンロード失敗例
curl: (18) transfer closed with 2450946337 bytes remaining to read

こちらの通信状況が良くても,ダウンロード元のサーバーから切断されてしまうこともある。

そこで,これらの切断時にも継続してダウンロードできるように,wgetとcurlのオプションを指定する (参考: mac – Persistent retrying resuming downloads with curl – Super User)。

ポイントは以下の3点だ。

巨大ファイルの継続ダウンロードのポイント
  1. ファイルの継続ダウンロード: wget: -c, curl: -C -
  2. 再試行の指定: wget: -t 0/--tries 0, curl: --retry 999
  3. 接続拒否の取り扱い: wget, curl共通--retry-connrefused

wgetcurlのそれぞれのコマンドのオプションを解説していく。

wget

wgetコマンドでは以下のコマンドで巨大ファイルを継続してダウンロードできる。

wget -ct 0 --retry-connrefused URL

指定しているオプションは以下の通りとなる。

wgetのオプション
オプション 説明
-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

指定しているオプションは以下の通りとなる。

curlのオプション
オプション 説明
-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コマンドでも似たようなことができるだろう。必要になったタイミングでこちらの記事に追加したい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です