GWに関西方面への旅行を計画しているのですが、あちらでは愛用のPASMOが使えないそうで。この際、関西用のカードを買えということなのでしょうか? (ここでBGMに「My favorite things」が) そうだ 京都、ICOCA。すいません、寝不足気味です……。

さて、今回は「Wget」について。いわゆるダウンローダとして利用できるコマンドで、Public Betaから10.0のときには標準装備されていたが、なぜか10.1からその役割は「cURL」に取って代わられた。機能的にcURLに劣るわけではなく、むしろ便利な部分もあるほどで、ああこんなときWgetがあれば、と思うことも少なくない。ファイルのダウンロードは今後もなくなることもない日常作業、これを機会にWgetを再評価しよう、という主旨だ。

cURLとWget、ここが違う

Wgetの使い方を紹介する前に、OS X標準のダウンロード用コマンド「cURL」とWgetを比較してみよう。違いを理解することにより、敢えてWgetをインストールする理由が浮かび上がってくるはずだ。

まず決定的な違いが、ファイルの再帰的なダウンロードに対応しているかどうか。再帰的とは、指定した領域 (URL) の下位にあるファイル / ディレクトリすべてを操作対象にすることを意味し、早い話がサイト全体、またはサイト上にあるディレクトリの内容をサブディレクトリを含めすべてダウンロードする、という意味だ。残念ながら、cURLにはこの機能がない。

Wgetでは、拡張子を指定したファイルの一括ダウンロードも容易だ。複数の拡張子を同時に指定できるので、JPEGもGIFもまとめてゲットできる。ダウンロードを中断した位置から再開するリジューム機能も、もちろんサポートされている。

とはいえ、cURLにはWgetにない機能が豊富にある。HTTPはもちろんHTTPSやTFTPといった多数のプロトコルのサポート、プロキシ対応やユーザ認証など。特にファイルの連番ダウンロードは、Wgetでは難しい (対策はあるのだが) が、cURLではあっけないほどかんたんに実現できる。

まずはインストール

OS X 10.1以降のシステムにWgetは標準装備されていないため、まずはソースコードのダウンロードとコンパイルを行う。手順は以下のとおり、面倒ならばコマンドラインをターミナル画面にコピー & ペーストすればいい。

$ curl -O http://ftp.gnu.org/gnu/wget/wget-1.11.1.tar.bz2
$ tar xjf wget-1.11.1.tar.bz2
$ cd wget-1.11.1
$ ./configure ; make
$ sudo make install

Wgetの十八番「再帰的ダウンロード」

Wgetには、HTML上のリンクとディレクトリ構造をたどる機能が用意されている。この仕組みを理解していれば、サイトを一括コピーしたり、特定の階層だけダウンロードしたり、といった作業がラクに行える。

次のコマンドラインでは、「journal.mycom.co.jp」のサイト全体をダウンロードする。「-r」オプションが再帰的ダウンロードのためのオプションで、ダウンロードされたファイルは作成された「journal.mycom.co.jp」ディレクトリ以下に、階層構造を保ちつつコピーされる。

$ wget -r http://journal.mycom.co.jp/

画像ファイルだけダウンロードしたければ、拡張子を指定すればいい。「-A」オプションに続けて複数の拡張子を指定し、引数としてサイトのURLを与えればOK。以下の実行例では、サイト上のJPEGとGIFファイルすべてを、再帰的にダウンロードしている。

$ wget -r -A jpg,gif http://journal.mycom.co.jp/

実はできます、連番ダウンロード

さきほどWgetでは連番ダウンロードが難しい……と書いたが、シェルの機能を利用すれば対応できる。当コラムでも何度か紹介したことがある、強力無比なシェル「zsh」の連番生成機能を利用すればいいのだ。以下の実行例では、第265回で使用した画像ファイル (001l.jpg~004l.jpg) を、連番ダウンロードすることに成功している。

$ zsh
% wget http://journal.mycom.co.jp/column/osx/265/images/00{1..4}l.jpg

表: Wgetの主要なオプション

オプション 説明
-A 指定した拡張子のみダウンロードする
-E 指定した拡張子はダウンロードしない
-c 前回の続きからダウンロードする (レジューム)
-l ダウンロードの階層 (最大5) を指定する
-m ミラーリングする
-r 再帰的にダウンロードする
-x 強制的にディレクトリを作成する