14.4.4 ファイルの圧縮

UNIX でよく用いられる圧縮と伸張のコマンドとして, gzipgunzip があります.これらは,GZIP という形式の圧縮と伸張を行うコマンドです.これら 2 つのコマンドを使って,圧縮と伸張を試してみましょう.

gzip で圧縮

まず,次の 3 つのファイルを自分のディレクトリにダウンロードしてください.それぞれのファイル名を,マウスの右ボタンでクリックして,出てきたメニューから,リンク先のファイルを別名でダウンロードを選びます (ダウンロード先は自分で適当に決めましょう).

filenull.txt 00(16) のバイト (ASCII で NUL) のみのファイル
filetext.txt 普通の ASCII テキストファイル (主にアルファベットと空白)
filerand.txt 1 から 99 までのランダムなバイトが詰まったファイル

ls コマンドによって,どのファイルも大きさが 1000 バイトであることが分かります.

ls -lreturn2
-rw-r--r--@ 1 0000000000 student 1000 3 15 11:32 filenull.txt -rw-r--r--@ 1 0000000000 student 1000 8 1 2009 filerand.txt -rw-r--r--@ 1 0000000000 student 1000 8 1 2009 filetext.txt

各ファイル filename について,以下のいずれかのコマンドを実行することで,ファイルの内容を確認できますから試してみましょう.また,Emacs を用いても,それぞれのファイルの内容を確認できます.
less -f filenamereturn2
od -a filenamereturn2

gzip コマンドは,与えられたファイル filename を圧縮して, filename.gz というファイルを生成します. 次のように,3 つのファイルを圧縮してから,サイズを比較してみましょう.

gzip filenull.txtreturn2
gzip filerand.txtreturn2
gzip filetext.txtreturn2
ls -lreturn2
-rw-r--r-- 1 0000000000 student 42 3 15 11:32 filenull.txt.gz -rw-r--r-- 1 0000000000 student 892 8 1 2009 filerand.txt.gz -rw-r--r-- 1 0000000000 student 560 8 1 2009 filetext.txt.gz

元のファイルはいずれも同じ 1000 バイトであったのに, 00(16) のバイトのみが入っていた単調なファイル filenull.txt は非常に小さくなり, ランダムなバイトの入っていたファイル filerand.txt はそれほど小さくなっていないのがわかります.

gzip コマンドによる圧縮は,損失のない圧縮ですので,伸張することが可能です.伸張用のコマンド gunzip によって,圧縮されたファイル filename.gz を元のファイル filename に戻します.

gunzip filenull.txt.gzreturn2
gunzip filerand.txt.gzreturn2
gunzip filetext.txt.gzreturn2
ls -lreturn2
-rw-r--r-- 1 0000000000 student 1000 3 15 11:32 filenull.txt -rw-r--r-- 1 0000000000 student 1000 8 1 2009 filerand.txt -rw-r--r-- 1 0000000000 student 1000 8 1 2009 filetext.txt

tar でまとめて圧縮

tar コマンドを使うと,複数のファイルを 1 つにまとめて gzip による圧縮をすることができます.圧縮の際には czf というオプションを指定して使います.c がまとめるという操作を指定し, z が gzip による圧縮であることを表します.そして f の後に,対象となるファイルを指定します.

以下のようにして,file.tar.gz というファイルに 3 つのファイルをまとめて圧縮しましょう.

tar czf file.tar.gz filenull.txt filerand.txt filetext.txtreturn2
ls -lreturn2
-rw-r--r-- 1 0000000000 student 1697 3 15 11:47 file.tar.gz -rw-r--r-- 1 0000000000 student 1000 3 15 11:32 filenull.txt -rw-r--r-- 1 0000000000 student 1000 8 1 2009 filerand.txt -rw-r--r-- 1 0000000000 student 1000 8 1 2009 filetext.txt

ファイル名やファイルのつなぎ目を表す情報などが含まれるために,ファイルサイズが,それぞれのファイルを圧縮して足し合わせたもの (42+892+560=1494) よりは,大きくなるようです.

元のファイルを取り出すには,オプションで,c の代わりに x を指定します.

rm filenull.txt filerand.txt filetext.txtreturn2
ls -lreturn2
-rw-r--r-- 1 0000000000 student 1971 3 15 11:56 file.tar.gz
tar xzf file.tar.gz return2
ls -l return2
-rw-r--r-- 1 0000000000 student 1971 3 15 11:56 file.tar.gz -rw-r--r--@ 1 0000000000 student 1000 3 15 11:55 filenull.txt -rw-r--r--@ 1 0000000000 student 1000 8 1 2009 filerand.txt -rw-r--r--@ 1 0000000000 student 1000 8 1 2009 filetext.txt
tipsここで紹介する操作は,GUI では hwb14.3.5 ファイルの圧縮 に対応します.また圧縮の原理については hwb18.7 平均情報量とデータの圧縮 で紹介しています.必要に応じて参考にしてください.