基礎からのLinuxを読みなおしてみた(2)

概要


前回のエントリーid:Kshi_Kshi:20110119:1295417710  の続き。今回はアーカイブ・圧縮・解凍あたりで、今までなんとなく実行していたコマンドの意味を理解できた気になったので、メモることに。


内容 : アーカイブ・圧縮・解凍

tarコマンドはインストール作業をするときにダウンロードしたファイルを解凍する時に使用していたが、自らアーカイブを作成することはなかった。また、解凍時のオプションもいつもおまじないのように、tar.gzファイルだったら、オプションは"xvfz"と付ければよし!といったような感じでしか理解していなかった。そもそもtar,gz,bz2ファイルについての概要についても全然知らなかったので、今回、読み直してみて理解できた気がしたのでとてもよかった。

以下のコマンドについてのメモ。



確認環境

アーカイブ

アーカイブ(archive)とは

複数のファイルを一つのファイルにまとめること。そのためのソフトウェアをアーカイバという。関連するファイルをひとまとめにすることで、ネットワークを通じた送受信の手間を軽減したり、ディスクの管理を容易にしたりできる。最近ではファイルをまとめる際に圧縮を施すのが一般的になりつつある。

http://e-words.jp/w/E382A2E383BCE382ABE382A4E38396.html
tar : GNU 版 tar アーカイブ・ユーティリティー

tarはファイルのアーカイブに用いられ、多数のファイルを一つのファイルにまとめることができる。

http://ja.wikipedia.org/wiki/Tar

なるほど。.tarファイルの時点ではファイルはまとめているだけで、圧縮はしてないのか〜。イメージでは圧縮したものだと思っていた。.tarも.tar.gzも圧縮形式だと勘違いしていたみたい。.tar.gzは.tarファイルを作成した後、gzip圧縮をしてるってことらしい。

  • 今回使用するオプション
-c
新しいアーカイブを作成する
-t
アーカイブ内容の一覧を表示する
-x
アーカイブからファイルを抽出する
-r
アーカイブの最後にファイルを追加する
-f
Fというアーカイブ・ファイルまたはデバイスを使う(デフォルトは/dev/rmt0)
-v
処理したファイルの一覧を詳しく出力する
-p
許可情報を全て抽出する


アーカイブを作成してみる(-cオプション)


作業ディレクト

$ ls
a.txt  data
$ tree
.
|-- a.txt
`-- data
    `-- b

2 directories, 1 file

dataディレクトリのアーカイブ(data.tar)を作成する

$ tar -c data -f data.tar
$ ls
a.txt  data  data.tar

アーカイブができた。

※簡潔表記を用いても、同様に作成できる。

$ tar cf data.tar data


アーカイブを調べる(-tオプション)


さきほど作成したアーカイブ(data.tar)を調べてみる

$ tar -t -f data.tar
data/
data/b/

-vオプションをつけると詳しい情報が取得できる

$ tar -t -f data.tar -v
drwxrwxr-x kshi/kshi 0 2011-01-21 03:08:09 data/
drwxrwxr-x kshi/kshi 0 2011-01-21 03:08:09 data/b/

※簡潔表記では

$ tar tfv data.tar


アーカイブへファイルを追加する(-rオプション)


また、作成したアーカイブ(data.tar)を用いて、このアーカイブにファイル(a.txt)を加えてみる
ディレクトリ内はこんな感じ

$ ls
a.txt  data  data.tar

a.txtを追加する処理〜確認

$ tar -r a.txt -f data.tar
$ tar tf data.tar
data/
data/b/
a.txt

追加された。

※簡潔表記では

$ tar rf data.tar a.txt


アーカイブからの抽出(-xオプション)


ディレクトリ内をdata.tarファイルだけにしておいてから、抽出(展開)作業を行ってみる。
作業ディレクトリ確認

$ ls
data.tar

このディレクトリにdata.tarの中身すべてを抽出する

$ tar -x -f data.tar
$ ls
a.txt  data  data.tar

抽出できた。アーカイブ自体は残る。

※簡潔表記では

$ tar xf data2.tar


部分抽出(-xオプション)


また抽出するファイルを指定することも可能。
例のために、以下のようなアーカイブ(data2.tar)を作成しておく(data/b.txtを加えただけ。)

$ tar tf data2.tar
data/
data/b/
data/b.txt
a.txt

今回はすべてを抽出せずに、data/b.txtの一部を抽出してみる。

$ tar -x data/b.txt -f data2.tar
$ ls
data  data2.tar
$ tree
.
|-- data
|   `-- b.txt
`-- data2.tar

1 directory, 2 files

data/b.txtのみ抽出できた。

※簡潔表記では

$ tar xf data2.tar data/b.txt


許可情報を維持して抽出(-x,-pオプション)

  • pオプションを追加するだけ(ユーザの権限に注意する必要あり,抽出先ディレクトリに書き込めるユーザじゃないとユーザ情報が実行したユーザになってしまうので)
$ tar xpf data.tar


※すべてに-vオプション付加、可能。つけるとアーカイブ作成・追加・抽出時ではどのファイルを対象にしたのかが分かる。



圧縮・解凍

gzip : ファイルの圧縮・伸張を行う


gzipとは

ほぼ全てのUNIXに標準搭載されているcompressコマンドがLZW関係の特許によりフリーでなくなったため、GNUプロジェクトにより、その置き換えを狙って開発された。現在、フリーのPC-UNIXにはほぼ確実に搭載されており、PC-UNIX界ではその目的は達成されたと言ってよい。

gzipは、Lempel-Ziv アルゴリズム(LZ77)とハフマン符号を用いており、従来のcompressよりも圧縮率が高いことが特徴である。ただし非常に冗長なファイルでは、compressの方が圧縮率が高いこともある。開発者向けにライブラリとしてzlibが作成され、これにより広く使われる形式となった。gzipによって圧縮されたファイルの拡張子は慣習的に .gz を用いる。

http://ja.wikipedia.org/wiki/Gzip

Linuxの圧縮形式におけるディファクトスタンダード。

  • 今回使用するオプション
-d
伸張する。
-v
詳細出力。圧縮・伸張される各ファイルについて名前と圧縮率を表示する。
-f
圧縮ファイル情報を得る。


圧縮


作業ディレクトリ内

$ ls
data.tar

圧縮!

$ gzip data.tar
$ ls
data.tar.gz

元のファイルがなくなり、.gzファイルができる。

※-vオプション付加

$ gzip -v data.tar
data.tar:        98.4% -- replaced with data.tar.gz

こんな感じで詳しい情報が得られる


圧縮ファイル情報取得


圧縮ファイル(data.tar.gz)の情報を取得する

$ gzip -l data.tar.gz
         compressed        uncompressed  ratio uncompressed_name
                186               10240  98.4% data.tar
$ ls
data.tar.gz

ファイルはそのまま。


解凍(伸張)


圧縮ファイル(data.tar.gz)を解凍してみる

$ gzip -d data.tar.gz
$ ls
data.tar

※-vオプション付加

$ gzip -dv data.tar.gz
data.tar.gz:     98.4% -- replaced with data.tar


bzip2 : ブロックソートによってファイルを圧縮・伸張する。


bzip2とは

bzip2(ビージップツー)は、ジュリアン・スーアード (Julian Seward) により開発されたオープンソースのデータ圧縮アルゴリズムである。1996年6月に最初の公開がなされ、その後の数年間で動作安定性と人気とが高まった。2000年末にversion 1.0が発表された。bzip2圧縮プログラムを用いて処理されたファイルには、拡張子として標準的には「.bz2」が付けられる。
bzip2は、より効率的な圧縮のためにブロックソート法(バロウズ-ホイラー変換)とMTF (Move-To-Front) 法、ハフマン符号化法を用いており、従来のgzipやZIPといったデータ圧縮法と比べ、より高い圧縮率を誇っている。また、bzip2の操作法は意図的にgzipに似せてあり、gzipからの移行は容易である。しかしながら、bzip2は処理速度の点でgzipよりも劣っており、gzipを完全に置換するには至っていない。しかし、StuffIt7-Zipといった高圧縮プログラムと比べれば圧縮率もそこそこ良い割りに高速に動作する。

http://ja.wikipedia.org/wiki/Bzip2

gzipと比べて一般的に圧縮率は高いが処理速度がかかるらしい。最近、bz2形式でのソフトウェア配布が増えてきているらしい。


※ 基本的にgzipコマンドと使用方法は変わらない気がするが、圧縮ファイル情報を取得する"-l"オプションがない。


圧縮

$ bzip2 data.tar

※詳しくは-vオプション付加

$ bzip2 -v data.tar
  data.tar: 56.264:1,  0.142 bits/byte, 98.22% saved, 10240 in, 182 out.

解凍(伸張)

$ bzip2 -d data.tar.bz2



tarとの連携(gzip,bzip2)


今までのは基礎みたいなもので、実際多く使うコマンドはこっちだろう。

tar + gzip

-zオプション
アーカイブgzipにフィルターする

を用いる。

アーカイブ作成・圧縮

$ tar -c data -f data.tar.gz -z
$ tar cfz data.tar.gz data

伸張(解凍)・アーカイブ抽出


$ tar -x -f data.tar.gz -z
$ tar xfz data.tar.gz


tar + bzip2

-jオプション
アーカイブをbzip2にフィルターする

を用いる

アーカイブ作成・圧縮

$ tar -c data -f data.tar.bz2 -j
$ tar cfj data.tar.bz2 data

伸張(解凍)・アーカイブ抽出

$ tar -x -f data.tar.bz2 -j
$ tar xfj data.tar.bz2



まとめ


"解凍"って書いてたが、Unix系統なら"伸張"って書いた方が正しいっぽい。全然しっくりこない・・・だって圧縮・解凍ソフトって言うじゃん。
どっちでも意味がわかるようになればいいかなと思う。


でも玄人と思われたいなら"伸張"と言ったほうが効果的な気もする。

ちょっと妄想してみた

~パソコン教室にて~
先生:「ファイルのダウンロードが終了したら、伸張して下さいね。」
生徒A:「ん?伸張??伸張ってなんですか?先生」
先生:「あっ、ごめんなさい。解凍のことです。」
先生:「ダウンロード後に解凍ですよ〜。」
・・・・
~授業終了後~
生徒A:「先生の専門用語半端ないよね〜。まじかっこいいよね〜。」
生徒B:「確かに。わかる〜。」

みたいな。