| この記事の要点 |
|
概要
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 などに限定するのが定石。
関連リンク
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15