【Linux】gzip・gunzipでファイルを圧縮する方法|元ファイルが消える罠・tar.gzとの違い

【Linux】gzip・gunzipでファイルを圧縮する方法|元ファイルが消える罠・tar.gzとの違い Linux

gzipは、ファイルを圧縮してサイズを小さくするコマンドです。ログファイルの保管、データの転送量削減などで日常的に使われます。.gzという拡張子のファイルは、このgzipで圧縮されたものです。解凍にはgunzip(またはgzip -d)を使います。

gzipには、初めて使う人が必ず驚く挙動があります。それは「圧縮すると、元のファイルが消えて.gzファイルに置き換わる」ことです。ziptarのように「元ファイルはそのままで圧縮版が別にできる」と思っていると、元ファイルが無くなって焦ります。この記事では、実機の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ファイルだけが残ります。「圧縮版が別にできる」のではなく「元ファイルが圧縮版に置き換わる」のです。

gzip の基本(元ファイルが消える)
# 元のファイル
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 が消えて元のファイルに戻った
gzipは元ファイルを残さない(実証)

実機で、48894バイトのbig.txtgzip 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.txtbig.txtbig.txt.gzの両方が残ること、gzip -c big.txt > archive.gz元ファイルを触らずに好きな名前(archive.gz)で圧縮ファイルを作れることを確認しました。-cは標準出力に圧縮データを流すので、リダイレクトで保存名を自由に決められます。「元ファイルは絶対に残したい」というときは、-kを付ける習慣をつけると安全です。

解凍せず中身を見る(zcat)

.gzファイルの中身をちょっと確認したいだけなのに、わざわざ解凍するのは面倒です。zcatを使えば、解凍せずに(元の.gzを残したまま)中身を表示できます。圧縮したままのログを調べるときに重宝します。

zcat で中身を確認
# 解凍せずに中身を表示(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...)が表示されることを確認しました。zcatgunzip -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 と 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.gzzオプションが内部でgzip圧縮)です。「単一ファイルならgzip、複数・ディレクトリならtar.gzと使い分けると覚えておきましょう。.gz(gzip単体)と.tar.gz(tarでまとめてgzip)は別物です。

圧縮レベルと圧縮率の確認

gzip圧縮レベルを-1(速いが低圧縮)〜-9(遅いが高圧縮)で指定できます(既定は-6)。またgzip -lで圧縮率を確認できます。

圧縮レベル(-1 〜 -9)
# 圧縮レベルを指定(元 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%削減)を確認できます。

主な書き方一覧

gzipgunzipの要点をまとめます。

書き方 働き
gzip ファイル 圧縮(元ファイルは消える)
gunzip ファイル.gz 解凍(.gzは消える)
gzip -k / -c 元ファイルを残す / 標準出力へ
zcat ファイル.gz 解凍せず中身を表示
gzip -1-9 圧縮レベル(速い〜高圧縮)
gzip -l 圧縮率を確認

よくある失敗

圧縮したら元ファイルが消えて焦る

gzipの正常な挙動です。残したいなら-k-cを使います。

ディレクトリをgzipしようとしてエラー

gzipは1ファイルのみです。ディレクトリはtar.gzでまとめます。

中身を見るためだけに毎回解凍する

zcatzgrepで、解凍せずに中身を確認・検索できます。

既に圧縮済みのファイルをさらにgzipする

画像・動画・.gzなどは、ほとんど縮まないか警告が出ます。

.gzとtar.gzを混同する

.gzは単一ファイル、.tar.gzは複数をまとめて圧縮したものです。

よくある質問

Qgzipしたら元のファイルが消えました。どうすれば残せますか?
Agzipは元ファイルを圧縮版(.gz)に置き換える仕様のため、既定では元ファイルが残りません。実機でもこの挙動を確認しています。元ファイルを残したい場合はgzip -k ファイル(keep)を使うか、gzip -c ファイル > 名前.gzのように標準出力へ出してリダイレクトしてください。どちらも元ファイルはそのまま残ります。
Qgzipとtar.gzの違いは何ですか?
Agzipは1つのファイルだけを圧縮するコマンドで、複数ファイルやディレクトリはまとめられません。複数・ディレクトリを1つに圧縮するには、tarでまとめてからgzip圧縮するtar.gztar -czf)を使います。「単一ファイルならgzip、複数・ディレクトリならtar.gz」と使い分けます。
Q圧縮されたログファイルを解凍せずに検索できますか?
Azcat ログ.gz | grep 検索語で、解凍せずに検索できます。zcatは圧縮ファイルの中身を展開せずに標準出力へ流すコマンドです。さらにzgrep 検索語 ログ.gzのように、圧縮ファイルを直接grepできるzgrepも便利です。ディスクを圧迫せずにログ調査ができます。
Qgzipの圧縮レベルはどれを使えばいいですか?
A-1(速いが低圧縮)から-9(遅いが高圧縮)まで指定でき、既定は-6です。実機でも、レベルが高いほどファイルが小さくなることを確認しています。多くの場合は既定の-6で十分で、速度優先なら-1、サイズを最小化したいなら-9を選びます。
Qgzで圧縮したファイルを解凍するには?
Agunzip ファイル.gzを使います(gzip -d ファイル.gzでも同じです)。解凍すると.gzが消えて元のファイルに戻ります。元の.gzを残したまま解凍したい場合はgunzip -kを使ってください。中身を見るだけならzcatが便利です。

まとめ

  • gzip ファイルで圧縮、元ファイルは消えて.gzに置き換わります
  • 解凍はgunzip。元ファイルを残すなら-k-c
  • 解凍せず中身を見るならzcatzgrepで検索も可)。
  • gzipは1ファイルのみ。複数・ディレクトリはtar.gz
  • 圧縮レベルは-1(速い)〜-9(高圧縮)、既定は-6

gzipは、単一ファイルの圧縮を最も手軽に行えるコマンドです。「元ファイルが置き換わる」「複数ならtar.gz」の2点さえ押さえれば、ログの保管やデータ転送でつまずくことはありません。tarとあわせて、Linuxのファイル圧縮を使いこなしましょう。