ここでは少々シェルから離れてデータ(ファイル)の圧縮・解凍について学びましょう.
普段皆さんも zip ファイルなどを見かけたことがあると思います. これは zip と呼ばれる圧縮形式で圧縮されたデータ(ファイル)です. 圧縮や解凍は普段の生活でもよく使われるので知っておく必要があるでしょう.
[5-1] データ圧縮・解凍
[5-1-1]データ圧縮・解凍とは?
例えば, メールでデータを添付したい, というときにはデータの容量が大きすぎると困ります. そのようなときにはデータ圧縮とデータ解凍を利用するのが良いでしょう. データ圧縮とは,あるデータを実質的な性質を失わずデータ量を減らした別のデータに変換することを言い, データ解凍とはその逆に圧縮されたデータを元のデータに戻すことを言います. データ圧縮には大きく分けて可逆圧縮と不可逆圧縮があります. 可逆圧縮とは圧縮前のデータと圧縮・解凍を行ったデータとが完全に等しくなる圧縮です. 有名なものは zip, gzip, 画像なら PNG, GIF, 音声なら wma 等があります. 元の品質を落とさずに圧縮できるがその分, 圧縮率は落ちます. 不可逆圧縮とは圧縮前のデータと圧縮・解凍を行ったデータとが等しくなくなるような圧縮です. 主に音声や画像, 映像で用いられて, 有名なものは画像なら JPEG, 動画なら MPEG-4, 音声なら MP3 等があります. 人間が感知しにくい/できない情報を削るとはいえ,品質は元データより若干落ちます.ただし,可逆圧縮に比べて高い圧縮率を誇ります.この実習では主に可逆圧縮の gzip について取り扱います.
[5-1-2] gzipによるデータ圧縮
gzip とは GNU ZIP の略で, GNU が提供している Linux でよく用いられる圧縮形式です.まずは圧縮するためのデータを持ってきましょう. 中身はaiueoなどと書かれている単純なテキストファイルです.
$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2016/0506/practical/data/data1.txt $ ls -lh -rw-r--r-- 1 taro taro 2.3K 2015-05-01 09:37 data1.txt |
見てわかるように容量は 2.3 KB あります. では, 実際に圧縮してみます.
$ gzip data1.txt $ ls -lh data1.txt.gz -rw-r--r-- 1 taro taro 83 2015-05-01 09:37 data1.txt.gz |
data1.txt が data1.txt.gz となりました. .gz は gzip で圧縮していることを表す拡張子です. 2.3 KB あったデータが 84 B にまで圧縮されました.
[5-1-3] gunzip によるデータ解凍
gzip 形式で圧縮されていた場合は gunzip というコマンドで解凍ができます.
$ gunzip data1.txt.gz $ ls -lh data1.txt -rw-r--r-- 1 taro taro 2.3K 2015-05-01 09:37 data1.txt |
data1.txt.gz が data1.txt に戻り, 元のデータと同じ容量になりました.
[5-2] アーカイブ
データを送信する際や圧縮する際に複数のデータをまとめて一つのデータにすると便利な場合があります. そういうときにはアーカイブ(書庫化)を行います. アーカイブとは複数のデータを一つにまとめることであり, まとめられたデータをアーカイブファイル(書庫)と呼びます.ここではディレクトリのアーカイブを行います.
[5-2-1] tar
Linux でアーカイブをするときによく用いられるコマンドが tar です. tar とそのオプションについて知りたいときは man tar をしてください.ではアーカイブしてもらいます. まずは, もう一つデータをダウンロードし, 先ほどの data1.txt と一緒に一つのディレクトリにまとめてもらいます.
$ wget http://www.ep.sci.hokudai.ac.jp/~inex/y2016/0506/practical/data/data2.txt $ ls data2.txt data2.txt $ mkdir ./datafile $ mv ./data*.txt ./datafile/ $ ls ./datafile/ data1.txt data2.txt |
では, アーカイブファイルを作成してみましょう. アーカイブファイルを作成するときには tar のオプションに c を指定します.
$ tar cvf data.tar datafile datafile/ datafile/data1.txt datafile/data2.txt $ ls -F ./ data.tar datafile/ |
作成できました. c 以外の他のオプションはそれぞれ, 作るときのファイルを表示するオプション v, ファイルを指定するオプション f です. 詳しくは man tar を見てください.
では作成できたアーカイブファイルの中身を表示してみましょう. 表示するときは tar のオプションに t を指定します.
$ tar tvf data.tar drwxr-xr-x taro/taro 0 2015-05-01 11:35 datafile/ -rw-r--r-- taro/taro 2300 2015-05-01 11:35 datafile/data1.txt -rw-r--r-- taro/taro 1350 2015-05-01 11:35 datafile/data2.txt |
ls -l と同様にアーカイブファイルに何があるか詳しく見ることができました.
次にアーカイブファイルを展開して元のディレクトリを作成してみましょう. 展開するためのオプションは x です. 展開できたか確認するために元のディレクトリを消去してから展開を行うことにします.
$ rm -r ./datafile $ ls ./ data.tar $ tar xvf data.tar datafile/ datafile/data1.txt datafile/data2.txt $ ls -F ./ data.tar datafile/ |
[5-3-2] アーカイブファイルの圧縮・解凍
gzip/gunzip は基本的に一つのデータに対してしか圧縮・解凍できません. しかしながら, アーカイブすることで複数のデータを同時に圧縮・解凍することもできます.gzip で複数のデータを圧縮するためには先ほど行った tar でアーカイブファイルを作り, それを圧縮するという順序で行います. しかしながら, tar には直接圧縮・解凍するオプションがあります. ここでは, tar を用いてディレクトリごと圧縮・解凍をしてみます.
アーカイブファイルを圧縮するためにはオプションに z を追加します.
$ tar zcvf data.tar.gz datafile datafile/ datafile/data1.txt datafile/data2.txt |
tar.gz というファイルができました. ここで元のファイルとtar.gz ファイルの容量を比較します. 元のdatafile の容量はdu コマンドを使います. du はディレクトリ内のファイル容量を表示するコマンドです. 容量の単位を適切な単位にするためにオプション b と h をつけます.
$ ls -lh ./data.tar.gz -rw-r--r-- 1 taro taro 253 2014-04-18 12:00 data.tar.gz $ du -bh ./datafile 7.6K datafile/ |
容量を見ると,元のディレクトリの中身の大きさが 7.6 KB だったのが 257 B まで小さくなりました.
最後に tar.gz ファイルを解凍してみます. その時も同じくオプション z を追加するとできます. アーカイブファイルを展開した時と同様に, 先に datafile ディレクトリを削除してから行うことにします.
$ rm -r ./datafile $ ls ./ data.tar.gz$ tar zxvf data.tar.gz datafile/ datafile/data1.txt datafile/data2.txt $ ls -F ./ data.tar.gz datafile/ |
<< 戻る(シェルスクリプト) 次へ >>(本日の課題)