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」で覚えておいた最後のディレクトリにカレントディレクトリを戻している。