UNIX でよく用いられる圧縮と伸張のコマンドとして, gzip と gunzip があります.これらは,GZIP という形式の圧縮と伸張を行うコマンドです.これら 2 つのコマンドを使って,圧縮と伸張を試してみましょう.
gzip で圧縮
まず,次の 3 つのファイルを自分のディレクトリにダウンロードしてください.それぞれのファイル名を,マウスの右ボタンでクリックして,出てきたメニューから,リンク先のファイルを別名でダウンロードを選びます (ダウンロード先は自分で適当に決めましょう).
filenull.txt 00(16) のバイト (ASCII で NUL) のみのファイル
filetext.txt 普通の ASCII テキストファイル (主にアルファベットと空白)
filerand.txt 1 から 99 までのランダムなバイトが詰まったファイル
ls コマンドによって,どのファイルも大きさが 1000 バイトであることが分かります.
ls -l
-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 filename
od -a filename
gzip コマンドは,与えられたファイル filename を圧縮して, filename.gz というファイルを生成します. 次のように,3 つのファイルを圧縮してから,サイズを比較してみましょう.
gzip filenull.txt
gzip filerand.txt
gzip filetext.txt
ls -l
-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.gz
gunzip filerand.txt.gz
gunzip filetext.txt.gz
ls -l
-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.txttar でまとめて圧縮
tar コマンドを使うと,複数のファイルを 1 つにまとめて gzip による圧縮をすることができます.圧縮の際には czf というオプションを指定して使います.c がまとめるという操作を指定し, z が gzip による圧縮であることを表します.そして f の後に,対象となるファイルを指定します.
以下のようにして,file.tar.gz というファイルに 3 つのファイルをまとめて圧縮しましょう.
tar czf file.tar.gz filenull.txt filerand.txt filetext.txt
ls -l
-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.txt
ls -l
-rw-r--r-- 1 0000000000 student 1971 3 15 11:56 file.tar.gztar xzf file.tar.gz
ls -l
-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ここで紹介する操作は,GUI では 14.3.5 ファイルの圧縮 に対応します.また圧縮の原理については 18.7 平均情報量とデータの圧縮 で紹介しています.必要に応じて参考にしてください.