コマンドラインからでもブラウザからでもWgetでダウンロード

Linuxユーザであれば、ほとんどの人がGNU Wget についてご存じのことと思う。 しかし、wget コマンドにURLを引数として渡して個別のファイルをダウンロードするという使い方以外にも、デスクトップアプリケーションと一緒に活用する方法もあるということはご存じだろうか。少々準備が必要ではあるものの、Wgetをお気に入りのブラウザやデスクトップアプリケーションと 簡単に統合することができるのだ。また、スクリプトの中でWgetを使うことによって、カテゴリごとにバッチ方式でダウンロードを行なったり、耐故障性を持たせたりすることもできる。この記事では、Wgetをあなたの思い通りに働かせる方法を紹介する。

ダウンロードしたいファイルが複数あり、そのURLがあらかじめ分かっている場合には、Wgetの「-i」オプションが役に立つ。 「-i」は、Wgetに(コマンドライン引数からではなく)ファイルから ダウンロードするべきURLのリストを読み込ませるようにするためのオプションだ。 「wget -i filelist」として実行すれば 後の仕事はWgetがやってくれるので、 あなたはファイルのダウンロードが完了するのを待つだけだ。

Wget以外のダウンロードマネージャのほとんどでは、 ダウンロードを一時停止するとサーバへの接続は切断されてしまう。 したがってダウンロードを再開したい場合には、サーバに再び接続し直すことになる。 一方Wgetを使ってダウンロードをする場合には、 「Ctrl-Z」の入力でダウンロードを一時停止させることができ、 この場合、ダウンロードを十分に素早く再開すれば、 接続は切断されない(通常は60秒を経過すると接続がタイムアウトする)。 つまり再接続のための時間がかからなくて済むのだ。

また、複数のファイルをダウンロードしたい場合に、 すべてのダウンロードが完了する前にWgetを(一時停止ではなく)完全に停止してしまったけれども、 その後再びダウンロードの続きを再開したくなり、 しかも、(すでにダウンロード済のファイルをはじめから再ダウンロードせずに) 最後にダウンロードしていたファイルの続きからダウンロードを再開したいという場合があるかもしれない。 このような場合には単に「wget -i filelist」とするだけでは やりたいことは実現できない。 というのも、 このような場合にはWgetが1つのファイルのダウンロードを完了したら、 そのファイルのURLをリストから削除する必要があるからだ。 このような場合には、 以下に示す短いスクリプトで、そのような処理を行なうことができる。

#!/bin/sh
# wget-list --ダウンロードしたファイルのリストを処分する

# 実行方法:wget-list(引数なしで実行)

while [ `find .wget-list -size +0` ]
 do
  url=`head -n1 .wget-list`
   wget -c $url
   sed -si 1d .wget-list
 done

このスクリプトを利用するには、 「.wget-list」という名前のファイルを作成し、 その中に「一行に一URL」という形式でURLのリストを保存すれば良い。 なお各行にはURLだけでなく、Wgetのオプションを書き加えることもできる。 例えば出力ファイルの名前を指定したい場合には 「 <URL> -O <filename> 」 (-O はWgetのコマンドラインオプション、 <filename> は出力ファイル名) という形式で書いておけば良い。 また、もしWget(あるいは他のアプリケーション)が ダウンロードの途中で中断され、 すでに部分的に取得したファイルが残っている場合には、 はじめから再取得するのではなくて その続きからダウンロードを再開したいということであれば、 「-c」というオプションを加えておけば良い。 その他のオプションについてはWgetのmanページを参照のこと。

このスクリプトでは、 Wgetがリストの最初のファイルのダウンロードを完了すると .wget-listファイル内の最初の行が削除され、 次のループではリストの次のファイルをダウンロードすることになる。 なお「Ctrl-C」を入力することでダウンロードを停止した場合は、 次回wget-listを実行すると、 ダウンロードを中断されたファイルの続きの所からダウンロードが再開されることになる。

また、ダウンロードしたファイルをカテゴリーごとに分類したい場合には、 「src(ソース)」や「movie-trailers(映画予告)」や「docs(文書)」といったような カテゴリーを表わす名前を付けた複数のディレクトリを ダウンロードしたファイルの保存用として作成すると良い。 そして各ディレクトリ内に .wget-listファイルをそれぞれ作成し、 以下に示すwget-allのようなマスタスクリプトを使用する。 wget-allは、各サブディレクトリ内の .wget-listファイルの処理を行なう。

#!/bin/sh
# wget-all --各サブディレクトリ内の .wget-listを処理する
# 実行方法:wget-all(引数なしで実行)

find -name .wget-list -execdir wget-list ';'

このスクリプトは、「.wget-list」という名前のファイルを見つけると そのディレクトリにおいてwget-listコマンドを実行する。

また、特定のカテゴリーから先に処理したい場合など、 カテゴリーごとの優先順位を設定しておきたい場合もあるだろう。 その場合には、 以下に示すwget-dirsなどを使って、 ディレクトリを処理する順番を指定すれば良い。

#!/bin/sh
# wget-dirs --指定されたディレクトリ内でwget-allを実行する
# 実行方法:wget-dirs <ディレクトリのパス> ...

for dir in $*
  do
      pushd $dir
      wget-all
      popd
  done
wget-all

このスクリプトを利用するためには引数を指定する必要がある。 例えば、最初にsrcディレクトリ内にファイルをダウンロードし、 次にdocsディレクトリ内にファイルをダウンロードしたいという場合には、 「wget-dirs src docs」として実行すると良い (指定したディレクトリが含まれているディレクトリに カレントディレクトリを忘れずに移動しておくか、 またはフルパスで指定)。 なおこのスクリプトでは、 「pushd」でカレントディレクトリを変更し直前のディレクトリをスタック内に覚えておき、 「popd」で覚えておいた最後のディレクトリにカレントディレクトリを戻している。

デスクトップとの統合

さて、 上記のwget-listスクリプトを活用するためには URLを簡単にリストに追加できると便利だ。 そこで以下のadd-urlスクリプトを使うと、 .wget-listファイルへURLを簡単に追加することができる。

#!/bin/sh
# add-url --リストへURLを追加する

# 実行方法:add-url URL

echo $* >>~/download/.wget-list
# ファイルのダウンロード先が ~/downloadの場合。

add-urlスクリプトはコマンドラインで使うのに便利だ。 ただしKDEユーザもKlipperを利用すれば、このadd-urlを便利に活用することができる。 Klipperにはクリップボード上にコピーされた文字列に対してコマンドを 実行する機能があるからだ。 設定をするために システムトレイ上のKlipperのアイコンを右クリックして設定ダイアログを開き、 「Configure Klipper(Klipperの設定)」を選び、「Actions(動作)」タブへ行く。 すると、様々な正規表現にマッチする文字列に対応する、 様々な動作のグループを設定することができるようになっているのが分かると思う。

そこにすでにHTTPのリンク(”^https?://.”)に対応するグループがあるはずだ。 そこでこのグループを右クリックして「Add(追加)」コマンドを選ぶ。 そしてコマンドとして「add-url %s」、 説明として「ダウンロード用キューへURLを追加」 と入力しよう。 その後「Global Shortcuts(グローバルショートカット)」タブへ行き、 動作を実行するためのショートカットを選択する。 このショートカットを使うたびに その時点でクリップボード上にある文字列に対応する 動作のメニューが表示されるはずであるが、 以上の設定をした後であれば、 WgetのキューへURLを追加する、 たった今準備したスクリプトを実行するための項目が増えているはずだ。

KlipperはすべてのアプリケーションからのURLの追加を自動化してくれるが、 URLを取得するのは大抵の場合はブラウザからになるだろう。 そこで、ブラウザのコンテキストメニューへ この項目を追加しておくと便利だ。

そのためには Firefox拡張用の FlashGot を利用する。 FlashGotを使うと、好きなダウンロードマネージャをFirefoxへ統合することができる。 FlashGotを ダウンロードして インストールしたら、 Firefoxの「Tools(ツール)」メニューから 「FlashGot→Settings(設定)」を選択する。 そしてadd-urlスクリプトのパスを入力する。 なお「Arguments template(引数テンプレート)」の欄は “[URL]” のままにしておく。 これで、Wgetを使ってファイルをダウンロードするために、 Firefox上で 「Download the link via FlashGot(FlashGot経由でリンクをダウンロード)」や 「Download everything via FlashGot(FlashGot経由ですべてをダウンロード)」などの FlashGotのコンテキストメニューの項目を使用できるようになった。

また、OperaユーザもWgetをダウンロードマネージャとして使用することが可能だ。 Operaのメインメニューで、 「Tools(ツール)→Preference(設定)」を選ぶ。 次に「Advanced(詳細)」タブへ行き、 左側にあるリストから「Toolbars(ツールバー)」を選ぶ。 そして「Menu Setup(メニュー設定)」の「Opera Standard」をクリックし、 さらに「Duplicate(複製)」をクリックする。 ここでダイアログを閉じないで、 Operaのメインウィンドウを最小化する。 そして「~/.opera/menu/standard_menu (1).ini」ファイルを開き、 以下の行を「Link Popup Menu(リンクに対するポップアップメニュー)」セクションと 「Image Link Popup Menu(イメージリンクに対するポップアップメニュー)」セクションに追加しよう。

Item, "Add to download queue"="Execute program, "/home/user/bin/add-url","%l""

なおここでは、add-urlのフルパスを 「/home/user/bin/add-url」としている (指定の際には「~」は使用しないよう注意)。

次にOperaのウィンドウを再び開き、 メニュー設定のOpera Standardの 「Copy(コピー)」を選択して「OK」をクリックする。 これで、以降、右クリックでコンテキストメニュー内に新しい項目が現れるはずだ。

今回はWgetのような「オールドスタイル」のコマンドラインツールを GUI環境へ統合する簡単な方法をいくつか紹介した。 なおもしあなたがGUIツールのファンなら、 GNOME用の Gwget や KDE用のKGetなど、Wgetのフロントエンドを使ってみるのも良いかもしれない。

分割ダウンロード

ダウンロードマネージャの中には、 「 分割ダウンロード」をサポートしているものもある。 分割ダウンロードを利用すると、 ファイルの中の複数の部分が平行してダウンロードされることになる。 分割ダウンロードは本来、 帯域をより効率良く活用するためのものだが、 常にそういう結果になるとは限らない。 というのも接続速度があまり高速ではないときには、 (オーバーヘッドのために、必要とされる通信量は増加するが) ファイルのダウンロード速度は高速化しないという場合もある。 そのため、 分割ダウンロードの利用を禁止している ウェブマスターもいる(ただし稀なケースではある)。

一方、分割ダウンロードを利用しないという選択肢にも、 特にWgetを利用する場合には利点もある。 Wget以外のダウンロードマネージャの場合には、 ファイルの既にダウンロードが完了した部分を記録するための情報を 内部的なデータベースに保持しているのだが、 Wgetの場合、単にファイルのサイズを読み取ることでこの情報を取得するようになっている。 そのためWgetでは、 Wget以外のアプリケーションがダウンロードを途中で中断した ファイルのダウンロードを再開するということが可能なのだ。 このことができるダウンロードマネージャは、Wget以外にはほとんど存在しない。 私は普段、 ブラウザでファイルのダウンロードを開始したときにファイルが大き過ぎると感じたら、 ブラウザでのダウンロードをやめてWgetを使って後ほどそのダウンロードを完了させるようにしている。

しかしそれでもなお分割ダウンロードをしたいという場合には、 コンソール用ダウンロードユーティリティの Aria2 が分割ダウンロードをサポートしている。

NewsForge.com 原文