doc drawn up: 2003-10-11 .. 2009-04-08

.tar.gz/bz2

UNIX 系の処理体系においては、.tar.gz ファイルというものが頻出しますが、Windows 系の処理体系に慣れていると面食らってしまうかもしれません。「Windows なら、ファイルを圧縮したいのなら、単に .zip ファイルにすれば済む話なのに、なぜ UNIX は tar と gzip という二重の手続をするのだろうか?」というのが普通に生じる疑問でしょう。

tar の本質

tar は特に「圧縮」を目的とはしていません。元々、ディレクトリ構造を丸ごと一つのファイルとしてバックアップするような用途のためのプログラムでした(それもその名の由来にも関係している通り、テープメディアを想定していました)。このような機能は Windows の場合、zip ファイルを扱う圧縮ソフト(WinZip)が圧縮機能の一部として当たり前のように備えている機能です。独立したプログラムにするほどのものでしょうか? ──ところが、tar の場合は単にディレクトリ構造を保持するだけでなく、他に UNIX 特有(Windows には無縁)のファイル・パーミッション情報も保持する働きもしています。それに対して、tar と組み合わせて使う相方の gzip の方は「圧縮」を専門とするプログラムなのです。そういうわけで、gzip で圧縮するのに先立って、UNIX 系のディレクトリ構造およびファイル・パーミッション情報を保持するために、まずは tar を用いてバックアップ用のファイルにしておくことが不可欠となるのです。

tar 自体は圧縮するプログラムではないので、.tar ファイルに置換したところで、基本的には容量上のメリットはありません(多数のファイルを単一の .tar ファイルに結合してまとめれば、若干は HDD の使用クラスターの節約になるかもしれませんが、実用上はあまり変わりはないでしょう)。イメージ的には、複数の本をたった一冊の超分厚い本にまとめてしまうような作業に相当します。

tar の実際

上のように説明しましたが、実際上は、.tar.gz を作りたいのに、いつも tar と gzip を使ってやるのは面倒ですから、さすがに Windows における WinZip 同様に、コマンド一発で結合(.tar 化)と圧縮(.gz 化)をやってくれるように、最近の tar は改善されています。

仕組みとしては、tar プログラムが内部的に、まず .tar ファイルに結合します。次にその内部的に得られた .tar ファイルを gzip で圧縮して .gz ファイル化して、最終的に得られた .tar.gz ファイルをユーザーに渡してくれるわけです。

【コマンド例】./documents/ のディレクトリ以下を丸ごと、backup.tar.gz というファイル名で gzip 圧縮されたバックアップファイルにする。:
tar -czf backup.tar.gz ./documents/

【コマンド例】上の gzip 圧縮されたバックアップファイルを解凍・復元する:
tar -xzf backup.tar.gz

gzip/bzip2

gzipbzip2 は、データ圧縮プログラムです。ファイルの圧縮バックアップが目的であれば、先述のように、tar から内部的に起動して利用するのが簡便でしょう。

gzip(ファイルは .gz)よりもさらに圧縮性能が高いのが bzip2 です(ファイルは .bz2 もしくは .bz)。自分で使うためなら bzip2 を使えば ok です。他人とのデータの受け渡しのようなことを想定する場合は、一般的な .gz ファイル(gzip)の方にすればいいでしょう。

圧縮効率について試してみたところ、355MB のディレクトリが gzip で 89.8MB に、bzip2 で 77.5MB に圧縮バックアップできました。圧縮効率を指定するオプションは何も指定せずにデフォルトで圧縮しました。そのため、bzip2 の場合はデフォルトで圧縮効率を最優先する(1 から 9 の数値のうち)9 のオプションになりますが、gzip の場合はデフォルトでは 6 のオプションで圧縮されることになるので、最高の圧縮性能が発揮されているわけではありません。とはいえ、tar から内部的に gzip や bzip2 を起動した場合は圧縮効率のオプションはそれぞれデフォルト値が使われているようなので、その場合の圧縮効率の比較としてはこれで ok ということになります。ちなみに、tar によるバックアップファイル化と gzip による圧縮をそれぞれ別個に行って、gzip による圧縮を圧縮効率 9 のオプションで行ってみましたが、デフォルト(6)の時に 89.8MB だったものが 89.3MB とほんの少し小さくなっただけに過ぎませんでした。

bzip2 を使った tar による圧縮バックアップ:

【コマンド例】./documents/ のディレクトリ以下を丸ごと、backup.tar.bz2 というファイル名で bzip2 圧縮されたバックアップファイルにする。:
tar -cjf backup.tar.bz2 ./documents/

【コマンド例】上の bzip2 圧縮されたバックアップファイルを解凍・復元する:
tar -xjf backup.tar.bz2

※古いバージョンの tar ではオプションに若干の違いがあり、-j オプションでは bzip2 圧縮が機能しない場合もあるようですので、その場合はヘルプ情報を参照するなどしてください。

mihr.net::Linux