【Linux】gzip/gunzipコマンドでファイルを圧縮・展開する

目次

概要

Linuxで最も標準的に利用されるファイル圧縮形式「.gz」を作成、および展開するためのコマンドです。

gzip はファイルを圧縮し、gunzip は展開(解凍)を行います。

注意点として、WindowsのZIP形式などとは異なり、このコマンド単体では「複数のファイルを一つにまとめる(アーカイブ)」機能はありません。ディレクトリごとアーカイブしたい場合は tar コマンドと組み合わせて使用します。

仕様(引数・オプション)

構文

gzip [オプション] ファイル名
gunzip [オプション] ファイル名

gunzipgzip -d と完全に等価です。

主な引数・オプション

オプション説明
-c / --stdout圧縮・展開した結果を標準出力へ書き出します(元のファイルを残したい場合に使用)。
-d / --decompress圧縮ファイルを展開します(gunzip と同じ)。
-f / --force同名ファイルが存在する場合などに強制的に上書き・圧縮します。
-l / --list圧縮ファイルの圧縮率や展開後のサイズなどの情報を表示します。
-r / --recursive指定したディレクトリ内のすべてのファイルを個別に再帰的に処理します。
-S <拡張子>圧縮ファイルの拡張子を .gz 以外(指定した文字列)に変更します(suffix)。
-n元のファイル名とタイムスタンプをヘッダーに保存しません。
-N元のファイル名とタイムスタンプをヘッダーから復元します(デフォルト)。
-1-9圧縮レベルを指定します。1 は最速(低圧縮)、9 は最高圧縮(低速)。デフォルトは 6 です。

基本の使い方

ファイルを圧縮し、その後展開して元に戻す基本的な手順です。

デフォルトでは、圧縮前の元ファイルは削除され、拡張子 .gz が付いたファイルに置き換わります。

コマンド

# ファイルを用意
touch app.log

# 圧縮を実行(app.log が消え、app.log.gz が生成される)
gzip app.log

# 確認
ls -l app.log*

# 展開を実行(app.log.gz が消え、app.log が復元される)
gzip -d app.log.gz
# または
gunzip app.log.gz

実行結果

-rw-r--r-- 1 user user 35 Jan 20 12:00 app.log.gz

実践コマンド

ディレクトリ内のファイルを再帰的に圧縮する

-r オプションを指定すると、ディレクトリ階層を降りていき、見つかったすべてのファイルを「個別に」圧縮します。

※ ディレクトリ全体が1つのファイルになるわけではありません。

# logsディレクトリ配下の全ファイルをそれぞれ .gz に圧縮
gzip -r ./logs/

圧縮ファイルの情報を確認する

展開することなく、元のファイルサイズや圧縮率を確認できます。

# 圧縮情報の表示
gzip -l app.log.gz
         compressed        uncompressed  ratio uncompressed_name
                 65                 120  48.3% app.log

圧縮レベル(1〜9)を変更してサイズを比較する

圧縮率(-9)と速度(-1)のトレードオフを確認する実験です。デフォルトは -6 です。

# テスト用ファイル作成
cp /bin/ls test_file

# 最速圧縮(レベル1)
cp test_file test_1 && gzip -1 test_1

# 最高圧縮(レベル9)
cp test_file test_9 && gzip -9 test_9

# サイズ比較
ls -l test_*
-rw-r--r-- 1 user user 65400 Jan 20 12:05 test_1.gz
-rw-r--r-- 1 user user 64200 Jan 20 12:05 test_9.gz

元ファイルを残して展開(または圧縮)する

-c オプションを使って結果を標準出力に送り、リダイレクトで別名保存することで、元のファイルを保持したまま処理を行います。

# 圧縮ファイルを残したまま、中身を展開して別ファイルに保存
gzip -dc data.csv.gz > data_restored.csv

# 元ファイルを残したまま圧縮ファイルを作成
gzip -c config.txt > config.txt.gz

カスタムポイント

  • 拡張子の変更: 通常は .gz ですが、-S を使うことで変更可能です。Bashgzip -S .z custom_file.txt ls # custom_file.txt.z ※ 展開時も gunzip -S .z custom_file.txt.z のように指定が必要です。非標準的な拡張子は管理が難しくなるため、特別な理由がない限り推奨されません。
  • テキストファイル閲覧: 圧縮されたテキストファイルの中身を少しだけ見たい場合は、zcatzless コマンドを使うと、展開の手間が省けて便利です。

注意点

  1. 元ファイルの消失:前述の通り、gzip file を実行すると元の file は削除されます。残したい場合は必ず -c オプションとリダイレクトを活用してください。
  2. ディレクトリの圧縮:gzip dir_name と実行しても「ディレクトリです」とエラーになります。gzip -r dir_name は「ディレクトリの中身を個別に圧縮」します。フォルダごと1つにまとめたい場合は、先に tar コマンドを使用してください(tar czf dir.tar.gz dir/)。
  3. 上書き確認:展開先に同名のファイルがある場合、デフォルトでは上書き確認のプロンプトが出ます。スクリプトなどで自動化する場合は -f (force) オプションを検討してください。

応用

findコマンドの結果をまとめて圧縮する

特定の条件(例えば更新から30日以上経過したログファイル)のみを検索し、それらを個別に圧縮してディスク容量を節約します。

# 30日以上前の *.log ファイルを検索し、それぞれ圧縮する
find /var/log/app -name "*.log" -mtime +30 -exec gzip {} \;

まとめ

gzipおよびgunzipコマンドは、Linuxシステムにおけるファイル圧縮のデファクトスタンダードです。単一ファイルのサイズ削減に特化しており、ログローテーションやデータの転送前処理としてバックグラウンドで頻繁に動作しています。「元ファイルが置き換わる」というデフォルトの挙動と、「ディレクトリをまとめる機能はない(それはtarの役割)」という点の2つを理解しておけば、トラブルなく活用できるシンプルで強力なツールです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次