gzip: Linuxのファイル圧縮とgzipの解凍、gunzip・zcatの使い方
gzipはLinuxでファイルひとつを.gzファイルに圧縮するコマンドで、解凍するときは同じコマンドに-dを付けるか、gunzipを使います。AlmaLinux 9サーバーで31,878バイトのアクセスログを圧縮すると4,424バイトに減り、解凍すると元のサイズと更新時刻がそのまま戻りました。
以下の出力はAlmaLinux 9.8サーバーのrootアカウントでテスト用フォルダーから実行した結果で、時刻はUTC基準です。アクセスログ、メモ、設定ファイルはテスト用に作ったサンプルファイルです。ログに出てくるIPアドレスもドキュメント用のサンプル値です。
1️⃣ gzipコマンドの使い方
テスト用フォルダーには、アクセスログ2つとメモファイル2つ、設定ファイルが入ったconfigフォルダーと空のrestoreフォルダーがあります。
ls -ltotal 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 restoregzipの後ろにファイル名を書くと、そのファイルは名前の末尾に.gzが付いた圧縮ファイルに変わります。access.logを圧縮する次のコマンドは、終わっても何も出力しません。
gzip access.log圧縮後にls -lで見ると、access.logはなくaccess.log.gzだけが残っています。31,878バイトだったログは4,424バイトになり、更新時刻は元のファイルの時刻のままです。
ls -l access.log access.log.gzls: 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.txtreadme.txt: 81.5% -- replaced with readme.txt.gz元のファイルを残すには-kを付けます。memo.txtを-kで圧縮すると、memo.txtとmemo.txt.gzが並んで残ります。
gzip -k memo.txtls -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.gz45バイトのmemo.txtは、圧縮後に71バイトとかえって大きくなりました。公式マニュアルによると、gzipは結果が元より大きくなっても圧縮を行い、圧縮ファイルの中に元のファイル名と時刻を一緒に保存します。
ファイルを複数まとめて指定すると、ファイルごとに別々の.gzファイルができます。configフォルダーの設定ファイル2つを圧縮すると、app.conf.gzとsite.conf.gzの2つのファイルになります。
gzip -v config/app.conf config/site.confconfig/app.conf: 78.7% -- replaced with config/app.conf.gz
config/site.conf: 87.7% -- replaced with config/site.conf.gzls -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.gz2️⃣ gzipの解凍
圧縮したaccess.log.gzを-dで解凍すると、何も出力されずにaccess.logが戻り、access.log.gzは残りません。
gzip -d access.log.gzls -l access.log access.log.gzls: 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.gzreadme.txt.gz: 81.5% -- created readme.txtls -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.gzgzipには解凍先フォルダーを指定するオプションがないため、別のフォルダーに解凍するときは-cで解凍した内容を標準出力に送り、[>]の後ろに新しいファイルのパスを書きます。次はmemo.txt.gzをrestoreフォルダーのmemo.txtに解凍するコマンドです。
gzip -dc memo.txt.gz > restore/memo.txtls -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は圧縮ファイルを解凍せずに、圧縮後のサイズと元のサイズ、縮んだ割合、解凍したときの名前を1行で出力します。access.logを-kでもう一度圧縮してから-lで確認すると次のようになります。
gzip -k access.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.log-vを一緒に付けると、圧縮方式(deflateを略したdefla)と元データのCRC、元ファイルの日付と時刻が前に加わります。
gzip -lv access.log.gzmethod 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.gzaccess.log.gz: OK-1から-9までの数字は圧縮レベルで、公式マニュアルによるとデフォルトは-6です。同じaccess.logを-cで3回圧縮し、wc -cでサイズを比べました。
gzip -c -1 access.log | wc -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| 圧縮レベル | .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 configgzip: config is a directory -- ignoredフォルダー内のファイルをすべて処理するときは-rを付けます。設定ファイル2つを圧縮しておいたconfigフォルダーをgunzip -rで解凍すると、2つのファイルが順に解凍されます。
gunzip -rv configconfig/app.conf.gz: 78.7% -- replaced with config/app.conf
config/site.conf.gz: 87.7% -- replaced with config/site.confls -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 configtar -tzvf config.tar.gzdrwxr-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で中身を見たりする流れを実際に入力して試せます。
4️⃣ gzipファイルの中身を見る
日付を付けて残した過去のログは、gzipで圧縮しておくと使う容量が減ります。次は前日のログであるaccess.log-20261027を圧縮するコマンドです。
gzip access.log-20261027圧縮したログは、解凍せずにzcatで中身を画面に出力します。zcatはgunzip -cと同じコマンドなので(公式マニュアルによる)、.gzファイルはそのまま残ります。
zcat access.log-20261027.gz | head -3192.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 13813zcatの出力はパイプでほかのコマンドに渡せます。wc -lで数えると、このログは600行です。
zcat access.log-20261027.gz | wc -l600圧縮したログから特定の文字列を探すときはzgrepを使います。-cを付けると[ 404 ]を含む行の数だけが出て、行の中身を見るには-cなしで実行します。
zgrep -c ' 404 ' access.log-20261027.gz37zgrep ' 404 ' access.log-20261027.gz | head -3192.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 414zcatは圧縮していないファイルを受け取ると、[not in gzip format]を出力して止まります。
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrepは圧縮していないファイルもそのまま読むので、今使っているログと圧縮しておいた過去のログを一度に検索できます。ファイルを2つ以上指定すると、行数の前にファイル名が付きます。
zgrep -c wp-login.php access.log access.log-20261027.gzaccess.log:36
access.log-20261027.gz:525️⃣ gzipのエラー
すでに.gzで終わるファイルをもう一度圧縮すると[already has .gz suffix -- unchanged]が出て、ファイルはそのまま残ります。
gzip access.log.gzgzip: access.log.gz already has .gz suffix -- unchanged逆に、.gzで終わらないファイルを-dで解凍すると[unknown suffix -- ignored]が出ます。
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignored名前だけが.gzで、gzipで圧縮していないファイルは[not in gzip format]で終わります。テキストファイルのmemo.txtをnotgzip.gzという名前でコピーして解凍すると、このメッセージが出ました。
cp memo.txt notgzip.gzgzip -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.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of file切れたファイルでも、zcatで解凍すれば切れた位置の手前までの内容は取り出せます。600行のログのうち162行がrestore/broken.logに残り、公式マニュアルも壊れた圧縮ファイルはzcatで前半部分を救うよう案内しています。
zcat broken.gz > restore/broken.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.log作成する.gzファイルと同じ名前のファイルがすでにあると、gzipは上書きするかを尋ねます。nを入力すると[not overwritten]とともに何も変えずに終わります。
gzip memo.txtgzip: 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.txtls -l memo.txt memo.txt.gzls: 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 & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。