gzipは、ファイルを圧縮してサイズを小さくするコマンドです。ログファイルの保管、データの転送量削減などで日常的に使われます。.gzという拡張子のファイルは、このgzipで圧縮されたものです。解凍にはgunzip(またはgzip -d)を使います。
gzipには、初めて使う人が必ず驚く挙動があります。それは「圧縮すると、元のファイルが消えて.gzファイルに置き換わる」ことです。zipやtarのように「元ファイルはそのままで圧縮版が別にできる」と思っていると、元ファイルが無くなって焦ります。この記事では、実機のLinux(WSLのDebian)でこの挙動を実際に再現しながら、gzipの使い方と、元ファイルを残す方法、tar.gzとの違いを整理します。
gzip ファイルで圧縮。元ファイルは消えて.gzに置き換わります。- 解凍は
gunzip ファイル.gz(またはgzip -d)。.gzが消えて元に戻ります。 - 元ファイルを残すには
-k(keep)、または-cで標準出力へ。 - 解凍せず中身を見るには
zcatが便利です。 gzipは1ファイルだけ。複数やディレクトリはtarでまとめてから(tar.gz)。- 圧縮レベルは
-1(速い)〜-9(高圧縮)で調整できます。
複数ファイル・ディレクトリの圧縮はtarコマンド(tar.gz)、ファイルのコピー・移動はcp・mv・rm、大きなファイルの閲覧はcat・lessもあわせて参考になります。
【最重要】gzipは元ファイルを消して.gzに置き換える
まず、gzipで最も重要な挙動を押さえます。gzip ファイルを実行すると、元のファイルは消え、圧縮された.gzファイルだけが残ります。「圧縮版が別にできる」のではなく「元ファイルが圧縮版に置き換わる」のです。
# 元のファイル ls # big.txt (48894 バイト) # gzip で圧縮すると… gzip big.txt ls # big.txt.gz (22628 バイト) # ↑ big.txt が消えて big.txt.gz になった!(元ファイルは残らない) # 解凍すると元に戻る(今度は .gz が消える) gunzip big.txt.gz ls # big.txt ← .gz が消えて元のファイルに戻った
実機で、48894バイトのbig.txtをgzip big.txtで圧縮したところ、big.txtが消えてbig.txt.gz(22628バイト)だけが残りました。「圧縮版が別にできて元ファイルもある」わけではなく、元ファイルが圧縮ファイルに置き換わるのがgzipの仕様です。同様に、gunzip big.txt.gzで解凍すると今度は.gzが消えてbig.txtに戻りました。zipコマンドやWindowsの圧縮に慣れていると「元ファイルが消えた!」と驚きますが、これが正常な動作です。もし元ファイルを残したまま圧縮版も作りたい場合は、次に説明する-kや-cを使います。大事なファイルを圧縮するときは、この「置き換わる」性質を理解しておかないと、思わぬデータの扱いミスにつながります。
元ファイルを残す(-k / -c)
元ファイルを残したまま圧縮したいときは、-k(keep)を使うか、-c(標準出力へ)でリダイレクトします。どちらも元ファイルはそのまま残ります。
# -k: 元ファイルを残して圧縮(keep) gzip -k big.txt ls # big.txt big.txt.gz ← 両方残る # -c: 標準出力へ出して、リダイレクトで保存(元ファイルは触らない) gzip -c big.txt > archive.gz ls # big.txt archive.gz ← 元ファイルはそのまま、好きな名前で保存 # 解凍側も同様に -k / -c が使える gunzip -k big.txt.gz # 元の .gz を残して解凍
実機でも、gzip -k big.txtでbig.txtとbig.txt.gzの両方が残ること、gzip -c big.txt > archive.gzで元ファイルを触らずに好きな名前(archive.gz)で圧縮ファイルを作れることを確認しました。-cは標準出力に圧縮データを流すので、リダイレクトで保存名を自由に決められます。「元ファイルは絶対に残したい」というときは、-kを付ける習慣をつけると安全です。
解凍せず中身を見る(zcat)
.gzファイルの中身をちょっと確認したいだけなのに、わざわざ解凍するのは面倒です。zcatを使えば、解凍せずに(元の.gzを残したまま)中身を表示できます。圧縮したままのログを調べるときに重宝します。
# 解凍せずに中身を表示(gunzip -c と同じ) zcat archive.gz # ファイルの中身が表示される(.gz はそのまま残る) # 圧縮ログを grep で検索(解凍不要) zcat access.log.gz | grep "error" # 先頭だけ見る zcat archive.gz | head # zgrep, zless など z 付きコマンドも便利 zgrep "404" access.log.gz
実機でも、zcat archive.gzで解凍せずに中身(先頭が1 2 3...)が表示されることを確認しました。zcatはgunzip -cと同じで、圧縮ファイルを展開せずに内容を標準出力へ流します。これが便利なのは、圧縮されたログファイル(access.log.gzなど)を、解凍せずにそのままgrepで検索できることです。zcat ログ.gz | grep エラーのように使えば、ディスクを圧迫せずログ調査ができます。同様にzgrep(圧縮ファイルを直接grep)やzless(圧縮ファイルをless)といったz付きコマンドも用意されています。
【重要】gzipは1ファイルだけ(tar.gzとの違い)
gzipを使ううえで理解すべき重要な点が、gzipは「1つのファイル」しか圧縮できないことです。複数のファイルやディレクトリをまとめて1つに圧縮したい場合は、tarでまとめてからgzipする(=tar.gz)必要があります。
# gzip は1ファイルずつ。ディレクトリは圧縮できない gzip mydir/ # エラー(ディレクトリは対象外) # 複数ファイル・ディレクトリは tar でまとめてから gzip tar -czvf archive.tar.gz mydir/ # c=作成 z=gzip圧縮 v=経過 f=ファイル名 # → mydir をまとめて archive.tar.gz にする # 使い分け: # gzip file.txt → 単一ファイルの圧縮(file.txt.gz) # tar -czf x.tar.gz dir/ → 複数/ディレクトリの圧縮
gzipはあくまで「1つのファイルを小さくする」コマンドで、複数ファイルをまとめる機能はありません。ディレクトリや複数ファイルを1つの圧縮ファイルにしたいときは、tarで「まとめる」処理をしてからgzipで「圧縮する」——この2段階が必要で、それをまとめて行うのがtar -czf archive.tar.gz(zオプションが内部でgzip圧縮)です。「単一ファイルならgzip、複数・ディレクトリならtar.gz」と使い分けると覚えておきましょう。.gz(gzip単体)と.tar.gz(tarでまとめてgzip)は別物です。
圧縮レベルと圧縮率の確認
gzipは圧縮レベルを-1(速いが低圧縮)〜-9(遅いが高圧縮)で指定できます(既定は-6)。またgzip -lで圧縮率を確認できます。
# 圧縮レベルを指定(元 150893 バイトのテキストの例) gzip -1 -c text.txt | wc -c # 5608 バイト(速いが低圧縮) gzip -6 -c text.txt | wc -c # 5495 バイト(既定) gzip -9 -c text.txt | wc -c # 5428 バイト(遅いが高圧縮) # ↑ レベルが高いほど小さくなる(そのぶん時間はかかる) # gzip -l で圧縮率を確認 gzip -l archive.gz # compressed uncompressed ratio uncompressed_name # 22628 48894 53.8% archive
実機で、繰り返しの多いテキスト(150893バイト)を各レベルで圧縮したところ、-1で5608バイト、-6(既定)で5495バイト、-9で5428バイトと、レベルが高いほどファイルが小さくなることを確認しました。ただし高レベルほど圧縮に時間がかかるため、実用上は既定の-6で十分なことが多いです。速度優先なら-1、サイズを最小化したいなら-9を選びます。なお、圧縮率はデータの内容によって大きく変わり(テキストはよく縮み、既に圧縮された画像・動画はほとんど縮みません)、まれに特殊なデータではレベルによる差が直感と異なることもあります。gzip -lで実際の圧縮率(この例では53.8%削減)を確認できます。
主な書き方一覧
gzip・gunzipの要点をまとめます。
| 書き方 | 働き |
|---|---|
gzip ファイル |
圧縮(元ファイルは消える) |
gunzip ファイル.gz |
解凍(.gzは消える) |
gzip -k / -c |
元ファイルを残す / 標準出力へ |
zcat ファイル.gz |
解凍せず中身を表示 |
gzip -1 〜 -9 |
圧縮レベル(速い〜高圧縮) |
gzip -l |
圧縮率を確認 |
よくある失敗
圧縮したら元ファイルが消えて焦る
gzipの正常な挙動です。残したいなら-kや-cを使います。
ディレクトリをgzipしようとしてエラー
gzipは1ファイルのみです。ディレクトリはtar.gzでまとめます。
中身を見るためだけに毎回解凍する
zcatやzgrepで、解凍せずに中身を確認・検索できます。
既に圧縮済みのファイルをさらにgzipする
画像・動画・.gzなどは、ほとんど縮まないか警告が出ます。
.gzとtar.gzを混同する
.gzは単一ファイル、.tar.gzは複数をまとめて圧縮したものです。
よくある質問
gzip -k ファイル(keep)を使うか、gzip -c ファイル > 名前.gzのように標準出力へ出してリダイレクトしてください。どちらも元ファイルはそのまま残ります。gzipは1つのファイルだけを圧縮するコマンドで、複数ファイルやディレクトリはまとめられません。複数・ディレクトリを1つに圧縮するには、tarでまとめてからgzip圧縮するtar.gz(tar -czf)を使います。「単一ファイルならgzip、複数・ディレクトリならtar.gz」と使い分けます。zcat ログ.gz | grep 検索語で、解凍せずに検索できます。zcatは圧縮ファイルの中身を展開せずに標準出力へ流すコマンドです。さらにzgrep 検索語 ログ.gzのように、圧縮ファイルを直接grepできるzgrepも便利です。ディスクを圧迫せずにログ調査ができます。-1(速いが低圧縮)から-9(遅いが高圧縮)まで指定でき、既定は-6です。実機でも、レベルが高いほどファイルが小さくなることを確認しています。多くの場合は既定の-6で十分で、速度優先なら-1、サイズを最小化したいなら-9を選びます。gunzip ファイル.gzを使います(gzip -d ファイル.gzでも同じです)。解凍すると.gzが消えて元のファイルに戻ります。元の.gzを残したまま解凍したい場合はgunzip -kを使ってください。中身を見るだけならzcatが便利です。まとめ
gzip ファイルで圧縮、元ファイルは消えて.gzに置き換わります。- 解凍は
gunzip。元ファイルを残すなら-kや-c。 - 解凍せず中身を見るなら
zcat(zgrepで検索も可)。 gzipは1ファイルのみ。複数・ディレクトリはtar.gz。- 圧縮レベルは
-1(速い)〜-9(高圧縮)、既定は-6。
gzipは、単一ファイルの圧縮を最も手軽に行えるコマンドです。「元ファイルが置き換わる」「複数ならtar.gz」の2点さえ押さえれば、ログの保管やデータ転送でつまずくことはありません。tarとあわせて、Linuxのファイル圧縮を使いこなしましょう。
- grep(文字列検索)
- find(ファイル検索)
- sed(置換・行編集)
- awk(列抽出・集計)
- cut(列の切り出し)
- chmod(パーミッション)
- tar(圧縮・解凍)
- gzip・gunzip(ファイル圧縮)
- リダイレクトとパイプ
- echo・printf(文字列出力)
- ps・kill(プロセス管理)
- 環境変数とPATH
- which・type(コマンドの正体)
- ln(シンボリックリンク)
- cp・mv・rm(コピー/移動/削除)
- touch・mkdir(ファイル/フォルダ作成)
- basename・dirname(パス分解)
- history(コマンド履歴)
- curl(HTTP通信・API)
- wget(ダウンロード)
- ping(疎通確認)
- dig・nslookup(DNS調査)
- ss・netstat(ポート確認)
- jq(JSON処理)
- vim(基本操作・終了方法)
- cron・crontab(定期実行)
- test・[ ](条件判定)
- read(入力の読み取り)
- date(日付・時刻)
- sort・uniq・wc(並べ替え/集計)
- xargs(一括処理)
- chown・chgrp(所有者/グループ変更)
- diff(ファイル比較)
- du・df(ディスク使用量)
- head・tail(先頭/末尾・ログ監視)
- cat・less(ファイル表示)
- alias(コマンドの別名)
- nohup(SSH切断対策)
- tmux(セッション管理)
- よく使うコマンドまとめ
- cd(ディレクトリ移動)
