gzip: Linuxのファイル圧縮とgzipの解凍、gunzip・zcatの使い方

テスト環境RHEL系AlmaLinux 9.8rootアカウント2026-11-05 確認
圧縮・アーカイブコマンドgzipgunzipzcat場所/usr/bin/gzip
Linuxのファイル圧縮とgzipの解凍

gzipはLinuxでファイルひとつを.gzファイルに圧縮するコマンドで、解凍するときは同じコマンドに-dを付けるか、gunzipを使います。AlmaLinux 9サーバーで31,878バイトのアクセスログを圧縮すると4,424バイトに減り、解凍すると元のサイズと更新時刻がそのまま戻りました。

以下の出力はAlmaLinux 9.8サーバーのrootアカウントでテスト用フォルダーから実行した結果で、時刻はUTC基準です。アクセスログ、メモ、設定ファイルはテスト用に作ったサンプルファイルです。ログに出てくるIPアドレスもドキュメント用のサンプル値です。

1️⃣ gzipコマンドの使い方

  • ↪️ ファイルの圧縮と元ファイルを残す方法(-k)

テスト用フォルダーには、アクセスログ2つとメモファイル2つ、設定ファイルが入ったconfigフォルダーと空のrestoreフォルダーがあります。

ls -l
total 88
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log
-rw-r--r-- 1 root root 47748 Oct 27 23:59 access.log-20261027
drwxr-xr-x 2 root root    39 Oct 29 00:19 config
-rw-r--r-- 1 root root    45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root   426 Oct 27 09:10 readme.txt
drwxr-xr-x 2 root root     6 Oct 29 00:19 restore

gzipの後ろにファイル名を書くと、そのファイルは名前の末尾に.gzが付いた圧縮ファイルに変わります。access.logを圧縮する次のコマンドは、終わっても何も出力しません。

gzip access.log

圧縮後にls -lで見ると、access.logはなくaccess.log.gzだけが残っています。31,878バイトだったログは4,424バイトになり、更新時刻は元のファイルの時刻のままです。

ls -l access.log access.log.gz
ls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gz

-vを付けると、ファイルごとに縮んだ割合と新しいファイル名が表示されます。readme.txtの行の[81.5%]は元のサイズから縮んだ割合で、[replaced with]は元のファイルを.gzファイルに置き換えたという意味です。

gzip -v readme.txt
readme.txt:	 81.5% -- replaced with readme.txt.gz

元のファイルを残すには-kを付けます。memo.txtを-kで圧縮すると、memo.txtとmemo.txt.gzが並んで残ります。

gzip -k memo.txt
ls -l memo.txt memo.txt.gz
-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz

45バイトのmemo.txtは、圧縮後に71バイトとかえって大きくなりました。公式マニュアルによると、gzipは結果が元より大きくなっても圧縮を行い、圧縮ファイルの中に元のファイル名と時刻を一緒に保存します。

ファイルを複数まとめて指定すると、ファイルごとに別々の.gzファイルができます。configフォルダーの設定ファイル2つを圧縮すると、app.conf.gzとsite.conf.gzの2つのファイルになります。

gzip -v config/app.conf config/site.conf
config/app.conf:	 78.7% -- replaced with config/app.conf.gz
config/site.conf:	 87.7% -- replaced with config/site.conf.gz
ls -l config/
total 8
-rw-r--r-- 1 root root 206 Oct 20 11:00 app.conf.gz
-rw-r--r-- 1 root root  93 Oct 20 11:05 site.conf.gz

2️⃣ gzipの解凍

  • ↪️ gzip -dとgunzip、別のフォルダーへの解凍(-c)

圧縮したaccess.log.gzを-dで解凍すると、何も出力されずにaccess.logが戻り、access.log.gzは残りません。

gzip -d access.log.gz
ls -l access.log access.log.gz
ls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log

戻ったaccess.logはサイズが31,878バイトで、更新時刻も圧縮前と同じOct 28 23:50です。

gunzipはgzip -dと同じことをするコマンドです。-kを一緒に付けると圧縮ファイルを残したまま解凍し、-vの行の[created]は.gzファイルを消さずに新しいファイルを作ったという意味です。

gunzip -kv readme.txt.gz
readme.txt.gz:	 81.5% -- created readme.txt
ls -l readme.txt readme.txt.gz
-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
-rw-r--r-- 1 root root 108 Oct 27 09:10 readme.txt.gz

gzipには解凍先フォルダーを指定するオプションがないため、別のフォルダーに解凍するときは-cで解凍した内容を標準出力に送り、[>]の後ろに新しいファイルのパスを書きます。次はmemo.txt.gzをrestoreフォルダーのmemo.txtに解凍するコマンドです。

gzip -dc memo.txt.gz > restore/memo.txt
ls -l restore/
total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txt

-cで解凍するとmemo.txt.gzはそのまま残ります。新しく作ったrestore/memo.txtの更新時刻は、ファイルを作ったOct 29 00:19です。

3️⃣ gzipコマンドのオプション

  • ↪️ -l、-t、圧縮レベル、-r

-lは圧縮ファイルを解凍せずに、圧縮後のサイズと元のサイズ、縮んだ割合、解凍したときの名前を1行で出力します。access.logを-kでもう一度圧縮してから-lで確認すると次のようになります。

gzip -k access.log
gzip -l access.log.gz
         compressed        uncompressed  ratio uncompressed_name
               4424               31878  86.2% access.log

-vを一緒に付けると、圧縮方式(deflateを略したdefla)と元データのCRC、元ファイルの日付と時刻が前に加わります。

gzip -lv access.log.gz
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla b49b41c4 Oct 28 23:50                4424               31878  86.2% access.log

-tは圧縮ファイルが壊れていないかを検査するだけで終わります。-vと一緒に使うと、問題のないファイルの後ろに[OK]が出ます。

gzip -tv access.log.gz
access.log.gz:	 OK

-1から-9までの数字は圧縮レベルで、公式マニュアルによるとデフォルトは-6です。同じaccess.logを-cで3回圧縮し、wc -cでサイズを比べました。

gzip -c -1 access.log | wc -c
5564
gzip -c -6 access.log | wc -c
4424
gzip -c -9 access.log | wc -c
4164
圧縮レベル.gzのサイズ元のサイズ比
元のファイル(access.log)31,878バイト100%
-1 (最速)5,564バイト17.5%
-6 (デフォルト)4,424バイト13.9%
-9 (最小)4,164バイト13.1%

-9はデフォルトより260バイト小さく、-1はデフォルトより1,140バイト大きくなりました。

フォルダー名だけを書くと[is a directory -- ignored]が出て、フォルダーはそのまま飛ばされます。

gunzip config
gzip: config is a directory -- ignored

フォルダー内のファイルをすべて処理するときは-rを付けます。設定ファイル2つを圧縮しておいたconfigフォルダーをgunzip -rで解凍すると、2つのファイルが順に解凍されます。

gunzip -rv config
config/app.conf.gz:	 78.7% -- replaced with config/app.conf
config/site.conf.gz:	 87.7% -- replaced with config/site.conf
ls -l config/
total 8
-rw-r--r-- 1 root root 840 Oct 20 11:00 app.conf
-rw-r--r-- 1 root root 528 Oct 20 11:05 site.conf

-rはフォルダー内のファイルをひとつずつ別々に圧縮・解凍し、複数のファイルをひとつにまとめることはしません。フォルダーをひとつの圧縮ファイルにするときは tarコマンドでまとめながら圧縮します。tar -czfでconfigフォルダーを圧縮すると、フォルダーと2つのファイルがconfig.tar.gzひとつに入ります。

tar -czf config.tar.gz config
tar -tzvf config.tar.gz
drwxr-xr-x root/root         0 2026-10-29 00:19 config/
-rw-r--r-- root/root       840 2026-10-20 11:00 config/app.conf
-rw-r--r-- root/root       528 2026-10-20 11:05 config/site.conf

📌 主なオプション: この記事で実行した結果

オプション作業この記事で確認した結果
-c結果を標準出力に出し、元のファイルはそのまま残す-dcの出力をrestore/memo.txtに渡すと45バイトのmemo.txtができた
-d解凍(gunzipと同じ)access.log.gzはなくなり、31878バイトのaccess.logが戻った
-k圧縮・解凍の後も元のファイルを残すmemo.txt(45バイト)とmemo.txt.gz(71バイト)が並んで残った
-vファイルごとに縮んだ割合と新しいファイル名を出力readme.txt: 81.5% -- replaced with readme.txt.gz
-l圧縮ファイルのサイズと割合、解凍したときの名前を一覧で出力圧縮後のサイズ4424、元のサイズ31878、割合86.2%、名前access.log
-t圧縮ファイルが壊れていないかを検査-tvでaccess.log.gz: OK、末尾が切れたbroken.gzはunexpected end of file
-rフォルダー内のファイルをすべて圧縮・解凍gunzip -rv configの1回でconfig/app.conf.gzとconfig/site.conf.gzが解凍された
-f同じ名前のファイルがあっても確認せずに上書き確認なしで上書きされ、memo.txtはなくmemo.txt.gz(71バイト)だけが残った
-1 ~ -9圧縮レベル(-1 最速、-9 最小、デフォルト -6)-1、-6、-9で圧縮した出力をwc -cで数えると5564、4424、4164

📎 その他のオプション: 公式マニュアルより

オプション作業
-N圧縮時に元のファイル名と時刻を保存し(圧縮のデフォルト)、解凍時に保存された名前と時刻で復元
-n圧縮時に元のファイル名と時刻を保存せず、解凍時は.gzだけを外した名前を使う(解凍のデフォルト)
-q警告をすべて出力しない
-S 接尾辞.gzの代わりに指定した接尾辞を付けて圧縮し、解凍時はその接尾辞を先に探す
--rsyncable圧縮ファイルをrsyncで別のサーバーと同期するとき、変わった部分だけが送られるように圧縮

🔲 gzipコマンドシミュレーター

次のシミュレーターで、gzipで圧縮し、解凍したりzcatとzgrepで中身を見たりする流れを実際に入力して試せます。

gzipコマンドシミュレーターgzip 1.12
[root@server work]#
ブラウザーの中だけで動き、実際のファイルは圧縮しません。圧縮後のサイズは実測値で、シミュレーターで新しく作った内容は推定値です。↑↓で前に入力したコマンドを呼び出せます。

4️⃣ gzipファイルの中身を見る

  • ↪️ zcat · zgrep

日付を付けて残した過去のログは、gzipで圧縮しておくと使う容量が減ります。次は前日のログであるaccess.log-20261027を圧縮するコマンドです。

gzip access.log-20261027

圧縮したログは、解凍せずにzcatで中身を画面に出力します。zcatはgunzip -cと同じコマンドなので(公式マニュアルによる)、.gzファイルはそのまま残ります。

zcat access.log-20261027.gz | head -3
192.0.2.50 - - [27/Oct/2026:00:00:00 +0000] GET / HTTP/1.1 200 15929
192.0.2.54 - - [27/Oct/2026:00:00:07 +0000] GET / HTTP/1.1 200 17699
192.0.2.4 - - [27/Oct/2026:00:00:14 +0000] GET / HTTP/1.1 200 13813

zcatの出力はパイプでほかのコマンドに渡せます。wc -lで数えると、このログは600行です。

zcat access.log-20261027.gz | wc -l
600

圧縮したログから特定の文字列を探すときはzgrepを使います。-cを付けると[ 404 ]を含む行の数だけが出て、行の中身を見るには-cなしで実行します。

zgrep -c ' 404 ' access.log-20261027.gz
37
zgrep ' 404 ' access.log-20261027.gz | head -3
192.0.2.23 - - [27/Oct/2026:00:02:06 +0000] GET /old-page-6/ HTTP/1.1 404 229
192.0.2.38 - - [27/Oct/2026:00:04:40 +0000] GET /old-page-2/ HTTP/1.1 404 217
192.0.2.22 - - [27/Oct/2026:00:07:42 +0000] GET /old-page-6/ HTTP/1.1 404 414

zcatは圧縮していないファイルを受け取ると、[not in gzip format]を出力して止まります。

zcat access.log | head -1

gzip: access.log: not in gzip format

zgrepは圧縮していないファイルもそのまま読むので、今使っているログと圧縮しておいた過去のログを一度に検索できます。ファイルを2つ以上指定すると、行数の前にファイル名が付きます。

zgrep -c wp-login.php access.log access.log-20261027.gz
access.log:36
access.log-20261027.gz:52

5️⃣ gzipのエラー

  • ↪️ not in gzip formatとunexpected end of file

すでに.gzで終わるファイルをもう一度圧縮すると[already has .gz suffix -- unchanged]が出て、ファイルはそのまま残ります。

gzip access.log.gz
gzip: access.log.gz already has .gz suffix -- unchanged

逆に、.gzで終わらないファイルを-dで解凍すると[unknown suffix -- ignored]が出ます。

gzip -d memo.txt
gzip: memo.txt: unknown suffix -- ignored

名前だけが.gzで、gzipで圧縮していないファイルは[not in gzip format]で終わります。テキストファイルのmemo.txtをnotgzip.gzという名前でコピーして解凍すると、このメッセージが出ました。

cp memo.txt notgzip.gz
gzip -d notgzip.gz

gzip: notgzip.gz: not in gzip format

ダウンロードが途中で切れて末尾が欠けた.gzファイルは[unexpected end of file]で終わります。圧縮した過去のログから先頭2,000バイトだけを残したbroken.gzを-tで検査した結果です。

head -c 2000 access.log-20261027.gz > broken.gz
gzip -t broken.gz

gzip: broken.gz: unexpected end of file

切れたファイルでも、zcatで解凍すれば切れた位置の手前までの内容は取り出せます。600行のログのうち162行がrestore/broken.logに残り、公式マニュアルも壊れた圧縮ファイルはzcatで前半部分を救うよう案内しています。

zcat broken.gz > restore/broken.log
wc -l restore/broken.log

gzip: broken.gz: unexpected end of file
162 restore/broken.log

作成する.gzファイルと同じ名前のファイルがすでにあると、gzipは上書きするかを尋ねます。nを入力すると[not overwritten]とともに何も変えずに終わります。

gzip memo.txt
gzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
	not overwritten

-fを付けると、確認せずにすぐ上書きします。-kを付けていないので、memo.txtはなくなりmemo.txt.gzだけが残ります。

gzip -f memo.txt
ls -l memo.txt memo.txt.gz
ls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz

圧縮を扱う中で出たエラーメッセージと、次に確認することは次のとおりです。

出力意味次に確認すること
already has .gz suffix -- unchangedすでに.gzで終わるファイルなので再圧縮しない圧縮する元のファイル名を書いたか
unknown suffix -- ignored.gzで終わらないファイルを解凍しようとしたlsで.gzファイルの名前
not in gzip format名前は.gzだがgzipで圧縮したファイルではない実際の形式(zip・tar)とそれに合うコマンド
unexpected end of file圧縮ファイルの末尾が欠けている元ファイルとサイズを比べて再ダウンロード・zcatで前半を救う
already exists; do you wish to overwrite作成するファイルと同じ名前のファイルがすでにある上書きしてよければyまたは-f・残すなら-cで別の名前
is a directory -- ignoredファイルの代わりにフォルダー名を書いたフォルダー内のファイルは-r・ひとつにまとめるならtar

🔢 FAQ & おすすめコンテンツ

configフォルダーをtarでまとめたx.tarをgzip -vで圧縮し、gunzip -vで解凍すると、.gzだけが外れた10,240バイトのx.tarが残りました。まとめたファイルまで取り出すには、tarでもう一度展開する必要があります。もう一度圧縮したx.tar.gzをtar -xzfでrestore/tフォルダーに展開すると、configフォルダーと設定ファイル2つが一度に出てきました。

同じアクセスログを600回つなげた28,648,800バイトのファイルを、レベルごとに2回ずつ圧縮しました。-1は約0.3秒で4,821,317バイト、デフォルトの-6は約0.65秒で3,625,500バイト、-9は約2.5秒で3,376,224バイトでした。-9は-6より約7%小さい代わりに、時間は4倍近くかかりました。

gzipは圧縮するとき、元のファイル名を.gzの中に一緒に保存します。readme.txt.gzをrestoreフォルダーにbackup-1.gzとしてコピーし、gzip -lNで見ると保存された名前readme.txtが表示され、gunzip -Nで解凍するとrestore/readme.txtが作られました。-Nなしで解凍すると、ファイル名から.gzだけを外した名前になります(公式マニュアルによる)。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 7   +   2   =