3.

GZ / GZIP(.gz / .tgz)完全ガイド — Deflate・HTTP Content-Encoding・tar.gz の事実標準

編集
この記事の要点
  • gzip は 1992 年に Jean-loup Gailly と Mark Adler が GNU プロジェクトのために開発した単一ファイル圧縮形式
  • 圧縮アルゴリズムは ZIP と同じ Deflate(LZ77 + ハフマン符号)
  • HTTP の Content-Encoding: gzip として、Web の転送効率化に欠かせない
  • TAR と組み合わせた tar.gz / .tgz は Unix 系の事実標準アーカイブ
  • gunzipzcatzlesszgrep など、展開せず読むツールが豊富
  • マジックナンバーは 1F 8B(2 バイト)
  • 単一ファイル圧縮であり、複数ファイルをまとめる機能はない(だから TAR と組む)

概要

gzip(GNU zip)は 1992 年、当時広く使われていた compress コマンドの .Z 形式が特許問題を抱えていたことを受け、その代替として Jean-loup Gailly(gzip 作者)と Mark Adler(Deflate 共同設計者)が GNU プロジェクトのために開発した、フリーで自由に使える圧縮形式です。

採用アルゴリズムは Deflate(LZ77 による辞書圧縮 + ハフマン符号)で、これは ZIP / PNG / HTTP の Content-Encoding と同じものです。Deflate そのものの仕様は RFC 1951、gzip ファイル形式は RFC 1952 で標準化されており、Web 関連の RFC との親和性が高いことから、HTTP/1.1 以降は事実上の Web 転送圧縮として広く使われています。

gzip の重要な性質は 「単一ファイルしか圧縮できない」 ことです。ZIP のように複数ファイルをまとめる機能はないため、ディレクトリを圧縮したいときは tar でひとつのストリームにまとめてから gzip に流します。これが .tar.gz.tgz(DOS の 8.3 文字制限の名残)の正体で、Unix 系 OSS の配布アーカイブの大半がこの形式です。

内部構造とマジックナンバー

gzip ファイルの先頭 2 バイトのマジックナンバーは 1F 8B です。続いて圧縮方式(08 = Deflate)、フラグ、オリジナルのタイムスタンプ(mtime)、エクストラフラグ、OS 種別が並びます。オプションでオリジナルのファイル名(NULL 終端)や任意コメントを格納でき、末尾には CRC32(誤り検出)と ISIZE(展開後サイズの下位 32 bit)が付きます。

仕様上は複数の gzip ストリームを単純連結したものも有効で、gunzip はそれを順次展開します。これにより並列 gzip 実装である pigz はマルチスレッドで圧縮しても標準の gunzip で展開できる、という重要な互換性を担保しています。

圧縮レベルは -1(最速・低圧縮)から -9(最遅・高圧縮)まで指定可能で、デフォルトは -6--rsyncable オプションを使うと rsync 差分が効きやすいブロック境界で圧縮するため、バックアップ用途で重宝します。

主な用途

  • Web サーバの転送圧縮(HTTP Content-Encoding: gzip、Nginx / Apache / CDN すべてが対応)
  • tar.gz によるソースコード配布(GNU/Linux 系 OSS の大半)
  • サーバログの世代圧縮(logrotate がデフォルトで gzip)
  • データベースダンプの保存(mysqldump の出力をパイプで gzip)
  • ゲノム配列や CSV データなど、テキストベース大容量データの保管

関連形式との比較

形式圧縮率速度マルチスレッド暗号化備考
gzip速いpigz で可なしWeb/Unix 標準
bzip2高い遅いpbzip2 で可なし旧来の高圧縮
xz (LZMA2)非常に高い非常に遅い-T で可なしカーネル配布
zstd中〜高非常に速い-T0 で可なし新世代標準
ZIP (Deflate)速い不可AES-256同じ Deflate を使う

コマンド・ツール

# 単一ファイルを gzip 圧縮(元ファイルは消える)
gzip access.log
# → access.log.gz が作られる

# 圧縮レベル最大で
gzip -9 huge.csv

# 元ファイルを残して圧縮
gzip -k access.log

# 展開(元の .gz は消える)
gunzip access.log.gz
# または
gzip -d access.log.gz

# 展開せず中身を見る(パイプラインで便利)
zcat access.log.gz | grep ERROR
zless access.log.gz       # ページャ
zgrep '500' access.log.gz # grep
ztail access.log.gz       # 環境による

# tar と組み合わせて tar.gz を作成・展開
tar czvf backup.tar.gz mydir/
tar xzvf backup.tar.gz

# mysqldump をストリーム圧縮
mysqldump -u root mydb | gzip > mydb-$(date +%F).sql.gz

# マルチスレッド圧縮(pigz)
pigz -p 8 huge.csv         # 8 スレッド使用
tar c mydir/ | pigz -p 8 > backup.tar.gz

注意点・落とし穴

  • 単一ファイルしか圧縮できない — フォルダごと圧縮したいなら必ず tar と組み合わせる。これを知らず「ファイル消えた」と慌てる初心者が多い。
  • デフォルトで元ファイルが消えるgzip foo.log を打つと foo.log は無くなり foo.log.gz だけが残る。元を残したいなら -k を付ける。
  • 暗号化機能はない — 機密データを圧縮しても保護されない。必要なら GPG と組み合わせる(gzip foo && gpg -c foo.gz など)。
  • ランダムアクセスが弱い — gzip ストリームは先頭から順に解凍しないと中身を取り出せない。巨大ログから途中の 1 行だけ高速取得したい場合は zstd の --long モードや、bgzip / dictzip のような特殊ツールを検討する。
  • 32bit の ISIZE フィールド — フッタの展開後サイズは下位 32 bit のみ。4GB 超のデータでも展開はできるが、gzip -l で表示されるサイズが正しくない場合がある。
  • HTTP gzip 圧縮の罠 — すでに圧縮済みのコンテンツ(PNG/JPEG/動画/zip)に gzip をかけても CPU を消費するだけでサイズは減らない。Nginx の gzip_types で text/* と application/json などに限定するのが定石。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ZIP(.zip)
  2. TAR(.tar)
  3. GZ / GZIP(.gz / .tgz)
  4. 7z(.7z)
  5. RAR(.rar)
  6. BZ2 / BZIP2(.bz2 / .tbz2)
  7. XZ / LZMA2(.xz / .txz)
  8. Zstandard(.zst / .zstd)
  9. CAB(.cab)
  10. LZH(.lzh / .lha)

最近更新/作成されたページ