基礎からのLinuxを読みなおしてみた(2)
概要
前回のエントリーid:Kshi_Kshi:20110119:1295417710 の続き。今回はアーカイブ・圧縮・解凍あたりで、今までなんとなく実行していたコマンドの意味を理解できた気になったので、メモることに。
確認環境
- CentOS release 5.5 (Final)
アーカイブ
アーカイブ(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」が付けられる。
http://ja.wikipedia.org/wiki/Bzip2
bzip2は、より効率的な圧縮のためにブロックソート法(バロウズ-ホイラー変換)とMTF (Move-To-Front) 法、ハフマン符号化法を用いており、従来のgzipやZIPといったデータ圧縮法と比べ、より高い圧縮率を誇っている。また、bzip2の操作法は意図的にgzipに似せてあり、gzipからの移行は容易である。しかしながら、bzip2は処理速度の点でgzipよりも劣っており、gzipを完全に置換するには至っていない。しかし、StuffItや7-Zipといった高圧縮プログラムと比べれば圧縮率もそこそこ良い割りに高速に動作する。
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)
今までのは基礎みたいなもので、実際多く使うコマンドはこっちだろう。
まとめ
"解凍"って書いてたが、Unix系統なら"伸張"って書いた方が正しいっぽい。全然しっくりこない・・・だって圧縮・解凍ソフトって言うじゃん。
どっちでも意味がわかるようになればいいかなと思う。
でも玄人と思われたいなら"伸張"と言ったほうが効果的な気もする。