gzipコマンドは、LZ77というアルゴリズムを用いて、ファイルを圧縮します。
ファイルが圧縮されたときのデフォルトの拡張子は.gzになります。圧縮の際によく使用される圧縮コマンドのひとつになります。
目次
- 1 LZ77とは
- 2 gzipコマンドの利用例
- 2.1 ファイルを圧縮し元ファイルは削除 (オプションなし)
- 2.2 圧縮ファイルを展開 (-dオプション)
- 2.3 標準出力に出力 (-cオプション)
- 2.4 元ファイルを残す (-kオプション)
- 2.5 圧縮時に情報を表示 (-vオプション)
- 2.6 圧縮ファイルかどうかを確認 (-tオプション)
- 2.7 ファイルの上書き (-fオプション)
- 2.8 エラーメッセージを表示しない (-qオプション)
- 2.9 圧縮ファイルの情報を確認 (-lオプション)
- 2.10 圧縮レベルを変更 (--fast,--bestオプション等)
- 2.11 ディレクトリ内のファイルを再帰的に圧縮 (-rオプション)
- 2.12 圧縮前のファイル名やタイムスタンプの保持する (-Nオプション)
- 2.13 圧縮前のファイル名やタイムスタンプの保持しない (-nオプション)
- 3 ディレクトリの圧縮について
- 4 圧縮ファイルの連結について
- 5 参考
LZ77とは
LZ77は、1977年にAbraham LempelとJacob Zivによって開発された、データの圧縮アルゴリズムになります。
LZ77の圧縮アルゴリズムは特定のデータ範囲に対して、始めに現れたデータパターンを記憶して、次に同じデータパターンが現れた時に、そのデータパターンを始めに現れたデータパターンの参照に置き換えて、データを圧縮します。
つまり、ファイルに同じデータパターンがあるほど、そのファイルを圧縮することができます。
gzipコマンドの利用例
ファイルを圧縮し元ファイルは削除
(オプションなし)
gzipコマンドはファイルをgz形式に圧縮します。オプションなしの場合は、ファイルを圧縮した後で、元ファイルを削除します。
コマンド例
1 |
gzip manual.txt |
コマンド例実行前
1 2 |
$ls manual.txt |
実行結果
1 2 |
$ls manual.txt.gz |
コマンド例
1 |
man gzip > manual.txt |
また、gzipコマンドはパイプを通して使用する場合、その出力をリダイレクトできます。
コマンド例
1 |
cat manual.txt | gzip > manual.txt.gz |
コマンド例実行前
1 2 |
$ls manual.txt |
実行結果
1 2 |
$ls manual.txt manual.txt.gz |
コマンド例と実行結果
1 2 3 |
$cat manual.txt | gzip gzip: compressed data not written to a terminal. Use -f to force compression. For help, type: gzip -h |
圧縮ファイルを展開
(-dオプション)
-dオプションは、圧縮ファイルを展開することができます。また、gz形式のファイルを展開するのにgunzipコマンドがあります。gunzipコマンドは、gzipに単純に-dオプションがついたコマンドと同じコマンドになります。
コマンド例
1 |
gzip -d manual.txt.gz |
または
1 |
gunzip manual.txt |
コマンド例実行前
1 2 |
$ls manual.txt.gz |
実行結果
1 2 |
$ls manual.txt |
標準出力に出力
(-cオプション)
-cオプションは、元のファイルはそのままの状態にしたまま、結果を標準出力に出力することができます。
コマンド例
1 |
gzip -c manual.txt > manual.txt.gz |
コマンド例実行前
1 2 |
$ls manual.txt.gz |
実行結果
1 2 |
$ls manual.txt manual.txt.gz |
-dオプションと組み合わせることで圧縮ファイルを展開しないまま、圧縮ファイルの内容を確認することができます。
また、圧縮ファイルの内容を確認するコマンドとしてzcatコマンドがあります。これはgzipコマンドに-dcオプションをつけたものと同じになります。
コマンド例
1 |
gzip -dc manual.txt.gz | head |
または
1 |
zcat manual.txt.gz | head |
実行結果
1 2 3 4 5 6 7 8 9 |
GZIP(1) General Commands Manual GZIP(1) NAME gzip, gunzip, zcat - compress or expand files SYNOPSIS gzip [ -acdfhklLnNrtvV19 ] [--rsyncable] [-S suffix] [ name ... ] gunzip [ -acfhklLnNrtvV ] [-S suffix] [ name ... ] zcat [ -fhLV ] [ name ... ] |
元ファイルを残す
(-kオプション)
-kオプションはgzipコマンドでファイルを圧縮する場合に元のファイルをそのまま残すことができます。
コマンド例
1 |
gzip -k manual.txt |
コマンド例実行前
1 2 |
$ls manual.txt |
実行結果
1 2 |
$ls manual.txt manual.txt.gz |
-dオプションを用いて、圧縮ファイルを展開する場合も同様に元のファイルを残します。
コマンド例
1 |
gzip -dk manual.txt.gz |
コマンド例実行前
1 2 |
$ls manual.txt.gz |
実行結果
1 2 |
$ls manual.txt manual.txt.gz |
圧縮時に情報を表示
(-vオプション)
ファイルを圧縮する時に、ファイル名や圧縮率等の情報を表示することができます。また、-lオプションや-tオプションでは、別の情報が表示されます。
コマンド例と実行結果
1 2 |
$gzip -v manual.txt manual.txt: 64.7% -- replaced with manual.txt.gz |
圧縮ファイルかどうかを確認
(-tオプション)
-tオプションは圧縮ファイルかどうかを確認することができます。圧縮ファイルの場合は何も表示されませんが、-vオプションと一緒に用いるとOKの文字が表示されます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$gzip -t manual.txt.gz $echo $? 0 $ $gzip -t file.txt gzip: file.txt: unexpected end of file $echo $? 1 $ $gzip -t -v manual.txt.gz manual.txt.gz: OK |
ファイルの上書き
(-fオプション)
ファイルを圧縮または展開するとき、同じ名前のファイルがある場合、上書きするかどうかをプロンプトで尋ねられます。
1 2 |
$gzip manual.txt gzip: manual.txt.gz already exists; do you wish to overwrite (y or n)? |
-fオプションを用いると、プロンプトで上書きするかどうかを尋ねられずにファイルを上書きすることができます。
コマンド例
1 |
gzip -f manual.txt |
エラーメッセージを表示しない
(-qオプション)
-qオプションを用いるとエラーメッセージの表示をしません。
コマンド例と実行結果
1 2 |
$cat manual.txt | gzip -q $ |
コマンド例と実行結果
1 2 3 |
$cat manual.txt | gzip gzip: compressed data not written to a terminal. Use -f to force compression. For help, type: gzip -h |
圧縮ファイルの情報を確認
(-lオプション)
-lオプションは引数に圧縮ファイルを指定して、その圧縮ファイルの情報を表示します。情報は圧縮後のサイズ、圧縮前のサイズ、圧縮率、圧縮前のファイル名になります。
コマンド例と実行結果
1 2 3 |
$gzip -l manual.txt.gz compressed uncompressed ratio uncompressed_name 6529 18420 64.7% manual.txt |
-vオプションを追加すると、さらに圧縮メソッド、誤り検出符号のCRC、タイムスタンプの情報が追加されます。
コマンド例と実行結果
1 2 3 |
$gzip -l -v manual.txt.gz method crc date time compressed uncompressed ratio uncompressed_name defla 0ca5a201 Jan 12 20:46 6529 18420 64.7% manual.txt |
圧縮レベルを変更
(--fast,--bestオプション等)
--fastや--bestまたは-1,-2,-3,...,-9までの数字のオプションで圧縮レベルを変更できます。
--fastは-1に、--bestは-9に対応して、-1に近いほど圧縮の速度は上がりますが、圧縮率は下がります。-9に近いほど圧縮の速度は遅くなりますが、圧縮率は上がります。
特に圧縮レベルについてのオプションがない場合、デフォルトは-6になります。
コマンド例のmanual.txtは、gzipのmanページをファイルに出力したものになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$gzip -1 -c -v manual.txt > manual_level1.txt.gz manual.txt: 60.0% $ $gzip -9 -c -v manual.txt > manual_level9.txt.gz manual.txt: 64.8% $ $gzip -l manual_level* compressed uncompressed ratio uncompressed_name 7395 18420 60.0% manual_level1.txt 6520 18420 64.8% manual_level9.txt 13915 36840 62.3% (totals) |
ディレクトリ内のファイルを再帰的に圧縮
(-rオプション)
-rオプションはディレクトリ内のファイルを再帰的に圧縮することができます。動作としてはファイルの場合はファイルを圧縮し、ディレクトリの場合はそのディレクトリの中に入っていき、そのディレクトリ内のファイルを同様に圧縮していきます。
コマンド例
1 |
gzip -r . |
コマンド例実行前
1 2 3 4 5 6 7 8 9 |
$tree . ├── dir1 │ ├── manual2_dir1.txt │ └── manual_dir1.txt ├── manual.txt └── manual2.txt 1 directory, 4 files |
実行結果
1 2 3 4 5 6 7 8 9 |
$tree . ├── dir1 │ ├── manual2_dir1.txt.gz │ └── manual_dir1.txt.gz ├── manual.txt.gz └── manual2.txt.gz 1 directory, 4 files |
圧縮前のファイル名やタイムスタンプの保持する
(-Nオプション)
-Nオプション(--nameオプション)を用いると、圧縮前のファイル名やタイムスタンプを保持します。
-Nオプションはファイルを圧縮するときのデフォルトになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ls -l 合計 20 -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:39 manual.txt $ $gzip -c -N manual.txt > manual_name.txt.gz $ls -l 合計 28 -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:39 manual.txt -rw-rw-r-- 1 ubuntu ubuntu 6529 1月 13 00:59 manual_name.txt.gz $ $rm manual.txt $ls manual_name.txt.gz $ $gzip -d -N manual_name.txt.gz $ls -l 合計 20 -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:39 manual.txt |
圧縮前のファイル名やタイムスタンプの保持しない
(-nオプション)
-nオプション(--no-nameオプション)を用いると、圧縮前のファイル名やタイムスタンプを保持しません。
-nオプションを用いた場合は、圧縮ファイル名から.gzのようなgzipの接尾辞を削除したファイル名になり、タイムスタンプは圧縮ファイルのタイムスタンプがコピーされます。これは圧縮前のファイル名が保持していないファイルを展開するときも同様になります。
-nオプションはファイルを展開するときのデフォルトになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$gzip -c -n manual.txt > manual_no-name.txt.gz $ls -l 合計 28 -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:39 manual.txt -rw-rw-r-- 1 ubuntu ubuntu 6518 1月 13 00:54 manual_no-name.txt.gz $ $gzip -d manual_no-name.txt.gz $ls -l 合計 40 -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:39 manual.txt -rw-rw-r-- 1 ubuntu ubuntu 18420 1月 13 00:54 manual_no-name.txt |
ディレクトリの圧縮について
gzipコマンドはディレクトリを圧縮することはできません。ディレクトリを圧縮しようとするとエラーメッセージが表示されて、ディレクトリについては無視されます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ls -F dir1/ $ $gzip dir1 gzip: dir1 is a directory -- ignored $ $ls -F dir1/ |
ディレクトリを圧縮する場合は、アーカイブファイルに変換してから圧縮します。また、アーカイブファイルにするコマンドとしてtarコマンドがよく使われます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$ls dir1 $ $tar -cf dir1.tar dir1 $ $ls dir1 dir1.tar $ $gzip dir1.tar $ $ls dir1 dir1.tar.gz |
tarコマンドの-cオプションはアーカイブファイルの作成で、-fオプションはアーカイブファイルの指定になります。また、tarコマンドの-zオプションを用いて、アーカイブファイルを作成すると同時にgzipで圧縮をすることもできます。
コマンド例と実行結果
1 2 3 4 5 6 |
$tar -czf dir1.tar.gz dir1 $ls dir1 dir1.tar.gz $ $gzip -t -v dir1.tar.gz dir1.tar.gz: OK |
gzipコマンドの-tオプションは圧縮ファイルかどうか確認することができ、-vオプションでその情報を表示することができます。
また、.tar.gz形式またはtgz形式(.tar.gzを簡略化した形式)のファイルの展開は
1 |
tar -xf dir1.tar.gz |
になります。tarコマンドがファイル形式を自動的に認識するので、アーカイブファイル作成に使用した-zオプションは必要ありません。
圧縮ファイルの連結について
ファイルの内容を連結させたいとき、gzipコマンドで圧縮させたファイルは、リダイレクトを用いて連結することが可能です。ただし、連結させた圧縮ファイルを再圧縮すると、ほとんどの場合は再圧縮したファイルの方がファイルサイズが小さくなります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$gzip -c manual.txt > manual.txt.gz $du -a -b manual.txt.gz 6529 manual.txt.gz $ $gzip -c manual.txt >> manual.txt.gz $du -a -b manual.txt.gz 13058 manual.txt.gz $ $gzip -dc manual.txt.gz | gzip > manual_rezip.txt.gz $du -a -b manual.txt.gz manual_rezip.txt.gz 13058 manual.txt.gz 6792 manual_rezip.txt.gz $ $gzip -l manual.txt.gz manual_rezip.txt.gz compressed uncompressed ratio uncompressed_name 13058 18420 29.3% manual.txt 6792 36840 81.6% manual_rezip.txt 19850 55260 64.1% (totals) |
コマンド例では再圧縮した場合、約半分のファイルサイズになっています。LZ77の圧縮アルゴリズムはデータの重複が多いとよりデータを圧縮できます。コマンド例では、同じファイルを連結したため、大幅にデータが圧縮されています。