UNIX/Linuxの部屋 コマンド:gzip 高機能なファイル圧縮・伸長ツール (gunzip)


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド gzip 高機能なファイル圧縮・伸長ツール (gunzip)

compress より圧縮率が高く、ファイルの末尾が.gz、.Z、.tgz、.taz のファイルを扱える。オプションなしで起動すると指定のファイルを圧縮し、ファイルの最後に .gz という拡張子をつける。
% ls -l (sample.txt のファイルサイズは 225KB)
-rw-r--r-- 1 user group 225280 Oct 6 07:52 sample.txt
% gzip sample.txt (sample.txt を圧縮)
% ls -l (ファイルサイズが 40KB に減少。ファイル名の最後に拡張子 .gz が付けられる)
-rw-r--r-- 1 user group 40289 Oct 6 07:52 sample.txt.gz
% gunzip sample.txt.gz (sample.txt.gz を伸長)
% ls -l (元通り)
-rw-r--r-- 1 user group 225280 Oct 6 07:52 sample.txt
また、
% gzip *.txt
と、複数のファイルを一度に圧縮することもできる。ただし、ファイルを一つにまとめるわけではないことに注意。UNIX でのアーカイブ (ファイルを一つにまとめること) には tar コマンドがよく使われる。

オプション
-c 圧縮・伸長の結果を標準出力に書き出す。ファイルへの書き込みは行なわない
-d 伸長する
-l 圧縮ファイルの内容・圧縮率を表示
-n ファイル名とタイムスタンプを保存する
-r ディレクトリを再帰的に扱う
-v バーボーズモード
-1 圧縮にかかる時間を短くする
-9 圧縮率の高い圧縮方法を使う

gunzip・gzip・gzcat ともファイルの実体は同じだが (ハードリンクされている)、どの名前で起動されたかによって伸長・圧縮・表示と動作を変える。どの名前で起動してもオプションを明示的に指定することで、全ての機能を実行できる。つまり
% gunzip sample.txt.gz
% gzcat sample.txt.gz
は、
% gzip -d sample.txt.gz
% gzip -dc sample.txt.gz
と同じである。

2GB 問題
Solaris・HP-UX・Linux などの gzip は 2GB 超のファイルに未対応であることが多い。

gzip 自体には「2GB」というファイルサイズの上限はない。また、最近の Solaris・HP-UX・Linux などの OS 自体は 2GB 超のファイルを問題なく扱える。ただし互換性からか、ソースをコンパイルすると、ファイルオフセット (off_t) が 32bit になってしまう環境が多い。このような環境でコンパイルしたバイナリは、gzip に限らず 2GB 超のファイルを生成できないし、既にある 2GB 超のファイルにアクセスすることはできない。

一般的には、コンパイル時に -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE というオプションを付けてコンパイルすればファイルオフセットが 64bit になることが多いようだ (Solaris2.6・Solari8・ HP-UX 11i・Linux で確認。AIX ではちょっと違うらしい)。

世の中で広く使われている gzip のバージョンは 1.2.4 であるが、ファイルオフセットが 32bit な環境で make すると、ファイルオフセットが 32bit な gzip が生成され、2GB 超のファイルを扱うことができない。SunSite や Linux 標準の gzip はこのように make されたものが多いので、2GB 超のファイルに未対応なことが多いのである。この場合、Makefile の CFLAGS に、上記のオプションを追加して再コンパイルすれば解決する。

gzip-1.3.3 の configure は少し賢くて、64bit ファイルポインタが使える場合は上記オプションを勝手に追加してコンパイルしてくれるため、2GB 問題は起こらないだろう。

ちなみに、ファイルオフセットが 32bit なのか 64bit なのかは以下のソースをコンパイルして実行すればわかる。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
main(){
printf("%d\n", sizeof(off_t));
}
出力結果が 4 ならば 32bit、8 ならば 64bit である。4 と表示された場合でも、上記オプションを付けてコンパイルすると、大抵の環境では 8 に変わるだろう (今どきの OS ならば)。

FreeBSD では (*BSD すべて?) ファイルオフセットは 64bit なので、2GB 問題は発生しない。少なくとも 2.2.7-RELEASE 以降は問題なし。Solaris や HP-UX でも、64bit モードでインストールした場合は、オプションなしでもファイルオフセットが 64bit となる。

なお、gzip-1.2.4 には元ファイルのサイズが 2GB 超のとき、gzip -l で表示されるファイルサイズがマイナス値になってしまうというバグがある (表示だけの問題)。

4GB 問題
こちらはあまり深刻な問題ではない。gzip-1.2.4 において、展開後のサイズが 4GB 超の圧縮済ファイルを zcat したときに、ファイル内容異常などのエラーが起こると実行が打ち切られてしまうとか、エラーメッセージがおかしくなる、といった内容である (試したわけではないので、違うかも)。

gzip.org にてパッチが公開されているので、それをあてればよい。gzip-1.3.3 では修正済。FreeBSD では 5.3-RELEASE で上記パッチが適用された。

gzip の開発体制
こんな細かなことまで説明したくはないのだが、正式版である gzip-1.2.4 は 1992 年頃にリリースされたもので、それ以降正式版がリリースされていない。つまり、昔の不具合をずっと引きずっているわけである。

gzip-1.3.3 は 2002年に公開されているが、まだベータ版である (2005年6月現在)。2GB の問題も、4GB の問題も、gzip-1.3 系を正式リリースすれば解決する。誰か gzip の開発を引き継いでやってください。

他の圧縮・伸長コマンドや、マルチコア対応版については下記項目を参照のこと。
>> FreeBSDオンラインマニュアル(man) FreeBSD gzip(1)
>> Linuxオンラインマニュアル(man) Linux gzip(1)


頑張って書いたおすすめコンテンツ!