Linuxでファイルを圧縮する場面は、バックアップ・ログの保管・ファイル転送など日常的に発生します。
この記事では、Linuxの
gzip コマンドの基本的な使い方から、gunzip・zcat との使い分け、圧縮レベルの選び方、tar との組み合わせ、パイプを活用した実務テクニック、さらに xz・bzip2 との比較まで、現場で必要な知識を網羅的に解説します。でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
gzipコマンドとは?Linuxで最も使われる圧縮コマンド
gzip(GNU zip)は、Linuxで最も広く使われているファイル圧縮コマンドです。圧縮されたファイルには .gz という拡張子が付きます。最大の特徴は「元ファイルを削除して .gz ファイルに置き換える」という動作です。これを知らずに実行すると「ファイルが消えた」と焦ることになるので、まずこの挙動をしっかり押さえてください。
※
gzip は1ファイルずつ圧縮するコマンドです。ディレクトリをまとめて1つのファイルにするには tar と組み合わせる必要があります(後述)。基本的な使い方 ~ 圧縮・解凍・中身の確認
1. ファイルを圧縮する(gzip)
最もシンプルな使い方です。ファイル名を指定するだけで圧縮できます。# ファイルを圧縮する(元ファイルは削除される) $ ls -l access.log -rw-r--r-- 1 root root 15728640 Mar 19 10:00 access.log $ gzip access.log $ ls -l access.log.gz -rw-r--r-- 1 root root 1245678 Mar 19 10:00 access.log.gz
access.log は削除され、access.log.gz だけが残ります。タイムスタンプとパーミッションは元ファイルから引き継がれます。2. 元ファイルを残して圧縮する(-k)
元ファイルを削除されたくない場合は-k(keep)オプションを付けます。# 元ファイルを残したまま圧縮する $ gzip -k access.log $ ls -l access.log* -rw-r--r-- 1 root root 15728640 Mar 19 10:00 access.log -rw-r--r-- 1 root root 1245678 Mar 19 10:00 access.log.gz
-k を付ける癖をつけておくと安心です。3. 圧縮ファイルを解凍する(gzip -d / gunzip)
.gz ファイルを元に戻す(解凍する)方法は2通りあります。# 方法1:gzip -d で解凍する $ gzip -d access.log.gz # 方法2:gunzip で解凍する(gzip -d と同じ動作) $ gunzip access.log.gz
gunzip は gzip -d のエイリアス(別名)です。どちらを使っても動作は同じなので、打ちやすい方を使えば問題ありません。解凍時も元の
.gz ファイルは削除されます。残したい場合は -k を付けてください。# .gzファイルを残したまま解凍する $ gzip -dk access.log.gz
4. 圧縮ファイルの中身を確認する(zcat)
解凍せずに中身を確認したい場合はzcat を使います。cat コマンドのgzip版だと考えてください。# 解凍せずに中身を表示する $ zcat access.log.gz # grep と組み合わせて特定の文字列を検索する $ zcat access.log.gz | grep "404" # less と組み合わせてページ送りで閲覧する $ zcat access.log.gz | less
なお、
zgrep を使えば zcat | grep を1コマンドで実行できます。# zcat | grep と同じ結果を1コマンドで得る $ zgrep "404" access.log.gz
5. 圧縮率や圧縮前後のサイズを確認する(-l / -v)
圧縮後のファイルについて、圧縮前のサイズや圧縮率を確認できます。# 圧縮ファイルの情報を表示する $ gzip -l access.log.gz compressed uncompressed ratio uncompressed_name 1245678 15728640 92.1% access.log
-v(verbose)を付けると、圧縮率がリアルタイムで表示されます。# 圧縮率を表示しながら圧縮する $ gzip -v access.log access.log: 92.1% -- replaced with access.log.gz
圧縮レベルを使い分ける(-1 ~ -9)
gzip には1(最速・低圧縮率)から9(最遅・高圧縮率)までの圧縮レベルがあります。デフォルトは -6 です。# 最速で圧縮する(圧縮率は低い) $ gzip -1 large_file.log # 最高圧縮率で圧縮する(時間がかかる) $ gzip -9 large_file.log # デフォルト(-6 と同じ) $ gzip large_file.log
・-1(最速):ディスク容量に余裕があり、圧縮速度を優先したい場合。リアルタイムのパイプ処理やバックアップスクリプトで有効
・-6(デフォルト):ほとんどの用途で最適なバランス。特に理由がなければこのまま使う
・-9(最高圧縮):長期保管するアーカイブなど、容量を最優先する場合。圧縮にかかる時間は長くなるが、-6と比べて劇的に小さくなるわけではない
多くの場合、デフォルトの
-6 で十分です。-9 にしても圧縮率は数%しか改善しないことが多い一方、圧縮時間は大きく増えます。ディレクトリ内を一括圧縮する(-r)
-r(recursive)オプションを使うと、ディレクトリ内のファイルを再帰的に圧縮できます。# /var/log/old/ 内のファイルを全て圧縮する $ gzip -r /var/log/old/
gzip -r はディレクトリをまとめて1つのファイルにするわけではありません。各ファイルが個別に .gz 化されます。ディレクトリごと1つのアーカイブにしたい場合は tar を使ってください。tarコマンドとの関係 ~ .tar.gz を理解する
gzip と tar の違いを整理しておきましょう。・gzip:1つのファイルを圧縮するコマンド。ディレクトリや複数ファイルのアーカイブ機能はない
・tar:複数のファイルやディレクトリを1つのアーカイブファイル(.tar)にまとめるコマンド。それ自体に圧縮機能はない
この2つを組み合わせたのが
.tar.gz(tarでまとめてからgzipで圧縮)です。tar コマンドの -z オプションで、アーカイブと圧縮を1コマンドで実行できます。# ディレクトリをtar.gzとしてアーカイブ+圧縮する $ tar -czf backup.tar.gz /var/www/html/ # tar.gzを解凍+展開する $ tar -xzf backup.tar.gz # tar.gzの中身を一覧表示する(解凍せずに確認) $ tar -tzf backup.tar.gz
gzip ファイル名 で十分・ディレクトリや複数ファイルをまとめて圧縮:
tar -czf アーカイブ名.tar.gz 対象 を使うパイプと組み合わせた実務テクニック
gzip はパイプ(標準入出力)との相性が良く、他のコマンドと組み合わせることで強力なバックアップ手順が構築できます。6. データベースのバックアップを直接圧縮する
mysqldump の出力をパイプで gzip に渡すと、ディスクに一時ファイルを作らずに圧縮されたバックアップが取れます。# MySQLのバックアップを直接圧縮して保存する $ mysqldump -u root -p dbname | gzip > /backup/dbname_$(date +%Y%m%d).sql.gz # 圧縮されたバックアップをリストアする $ zcat /backup/dbname_20260319.sql.gz | mysql -u root -p dbname
7. ログをリアルタイムに圧縮しながら保存する
大量の出力を圧縮しながらファイルに保存できます。# tcpdumpの出力を圧縮しながら保存する $ tcpdump -i eth0 | gzip > /tmp/capture_$(date +%Y%m%d).txt.gz # 標準入力から読み込んで圧縮する $ cat largefile.csv | gzip > largefile.csv.gz
8. SSH経由でファイルを圧縮転送する
リモートサーバーへのファイル転送時に、パイプで圧縮・解凍を挟むことで転送量を削減できます。# ローカルのディレクトリをリモートサーバーに圧縮転送する $ tar -cf - /var/www/html/ | gzip | ssh user@remote "cat > /backup/html_backup.tar.gz"
xz・bzip2との比較 ~ どれを使うべきか
Linux環境ではgzip の他にも bzip2 や xz といった圧縮コマンドがあります。それぞれの特徴を整理します。| 項目 | gzip | bzip2 | xz |
|---|---|---|---|
| 拡張子 | .gz | .bz2 | .xz |
| 圧縮率 | 中程度 | 高い | 最も高い |
| 圧縮速度 | 最も速い | 遅い | 最も遅い |
| 解凍速度 | 最も速い | 遅い | 速い |
| tar連携オプション | -z | -j | -J |
| 主な用途 | 日常の圧縮全般 | 配布パッケージ | 長期アーカイブ |
結論として、日常的な運用では
gzip を選んでおけば間違いありません。速度と圧縮率のバランスが最も良く、あらゆるLinux環境に標準で入っています。長期保管で容量を最小限にしたい場合は
xz、過去の配布物で見かける .bz2 ファイルの解凍には bzip2 -d を使う、という程度で十分です。トラブルシュート ~ gzipで起きるエラーと対処法
「not in gzip format」が出た場合
gzip -d や gunzip でこのエラーが出た場合、対象のファイルがgzip形式ではありません。$ gunzip data.gz gzip: data.gz: not in gzip format
file コマンドで実際のファイル形式を確認してください。# ファイルの実際の形式を確認する $ file data.gz data.gz: ASCII text
.gz でも中身がgzip形式とは限りません。単にリネームされただけのテキストファイルだったり、ダウンロードが途中で失敗した不完全なファイルだったりします。「already has .gz suffix -- unchanged」が出た場合
既に.gz 拡張子が付いているファイルを圧縮しようとすると、このメッセージが表示されます。$ gzip data.gz gzip: data.gz already has .gz suffix -- unchanged
-f(force)オプションで強制できますが、通常は必要ありません。「No space left on device」が出た場合
ディスク容量が不足していると圧縮処理が失敗します。gzip は圧縮中に一時的に元ファイルと圧縮ファイルの両方がディスク上に存在するため、元ファイルと同程度の空き容量が必要です。# ディスク使用量を確認する $ df -h # 不要なファイルを削除して空き容量を確保してから再実行する
「Permission denied」が出た場合
圧縮対象のファイルや出力先ディレクトリへの書き込み権限がない場合に発生します。ファイルのパーミッションを確認し、必要に応じてsudo を付けて実行してください。# パーミッションを確認する $ ls -l /var/log/access.log # root権限で圧縮する $ sudo gzip /var/log/access.log
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ファイルを圧縮する | gzip ファイル名 |
| 元ファイルを残して圧縮する | gzip -k ファイル名 |
| 圧縮ファイルを解凍する | gzip -d ファイル名.gz |
| 解凍せずに中身を確認する | zcat ファイル名.gz |
| 圧縮率を確認する | gzip -l ファイル名.gz |
| 最速で圧縮する | gzip -1 ファイル名 |
| 最高圧縮率で圧縮する | gzip -9 ファイル名 |
| ディレクトリ内を一括圧縮する | gzip -r ディレクトリ名 |
| ディレクトリをtar.gzにする | tar -czf アーカイブ名.tar.gz 対象 |
| DBバックアップを直接圧縮する | mysqldump -u root -p DB名 | gzip > backup.sql.gz |
| 圧縮済みgzファイルを検索する | zgrep "検索文字列" ファイル名.gz |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
