UNIX/Linuxの部屋 gzipコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド gzip 高機能なファイル圧縮・伸長ツール (gunzip) このエントリーをはてなブックマークに追加

gzip はファイルを圧縮・伸長 (展開・解凍) するツールである。compress より圧縮率が高く、ファイルの末尾が.gz、.Z、.tgz、.taz のファイルを扱える。UNIX/Linux で主に使われるが、Windows 版も存在する。



gzip コマンドの基本的な使い方
gzip コマンドの引数にファイル名を指定すると、そのファイルを圧縮し、ファイルの最後に .gz という拡張子をつけて保存する。
% ls -l
-rw-r--r-- 1 user group 225280 Oct 6 07:52 sample.txt
→ sample.txt のファイルサイズは 225KB
% gzip sample.txt
→ sample.txt を圧縮
% ls -l
-rw-r--r-- 1 user group 40289 Oct 6 07:52 sample.txt.gz
→ ファイルサイズが 40KB に減少。ファイル名の最後に拡張子 .gz が付けられる
伸長 (展開・解凍) は、gunzip コマンドを使う。
% 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 コマンドがよく使われる。

gzip コマンドのオプション
-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 で上記パッチが適用された。

関連コマンド

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