試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

tar,gzip,bzip2について

tarコマンドとtarボール

tarコマンドは、tarボールという形式の1つのファイルに複数のファイルやディレクトリをまとめ、タイムスタンプ、アクセス権、所有者の情報も格納するが、データの圧縮は行わない。*1
まとめたtarボールは、別途圧縮を行うことで、他の多くの圧縮形式のような「複数ファイルをまとめて圧縮」を実現できる。一見面倒そうではあるのだが、圧縮方式が自由というのは利点と言える。一部の圧縮形式(gzipとbzip2)に関しては、この2段階の処理を1度で行ってくれる。圧縮率の高い7z形式では、多少面倒になるが、圧縮率を優先するのであれば、使う価値がある(p7zipというパッケージが必要)。

実際の使い方は、例を参考にしたほうが、長いマニュアルを読むよりも分かりやすい。

以下の例では、処理されるファイルなどを詳細に表示するvオプションを付けているが、付けなくてもファイルの処理は行われる。

tarボールを新規作成

$ tar cvf test.tar [ファイルもしくはディレクトリ...]

tarボールを現在いるディレクトリに展開

$ tar xvf test.tar

tarボールを指定ディレクトリ以下に展開

$ tar xvf test.tar -C [ディレクトリ]

tarボールの内容を一覧

$ tar tvf test.tar

既存のtarボールにファイルやディレクトリを追加

$ tar rvf test.tar [ファイルもしくはディレクトリ...]

tarボールを作成する際に「/」から始まるフルパスを指定した場合、先頭の「/」が削られる。例えば

$ tar cvf usrlocal.tar /usr/local/

とした場合、展開されるときには、usr/以下という(展開される階層からの)相対的な場所となる。
完全なパス名を保存し、復元したいのであれば、-Pオプションをtarボール作成時と展開時の両方に付ける。下の例では、一般ユーザで書き込めない場所に展開されるため、sudoを使用している。

$ tar cvf usrlocal.tar /usr/local/ -P
$ sudo tar xvf usrlocal.tar -P

gzipとbzip2

  • 圧縮コマンドは、それぞれ「gzip」と「bzip2」。
  • 展開コマンドは、それぞれ「un」を付けて、「gunzip」と「bunzip2」。
  • どちらも、1つのファイルのみ圧縮し、複数のファイルをまとめることはしない。
  • 圧縮されたファイルの拡張子は、それぞれ「.gz」「.bz2」。
  • 圧縮率はbzip2のほうが高い。
  • zcat(gzip)、bzcat(bzip2)といったコマンドで簡単に圧縮されたデータが読めるため、小さなテキストファイル(書式情報を含まない、プレーンテキスト)を圧縮するのにも使われる。Emacs 22では、gzip/bzip2圧縮されたテキストファイルを開くと、自動的に展開してくれて、元のテキストデータを表示し、書き込むときには圧縮してくれる(圧縮を意識せずに(透過的に)扱える、といえる)。

gzip圧縮(最高圧縮)

$ gzip -9 [ファイルの場所]

bzip2圧縮

$ bzip2 [ファイルの場所]
元のファイルを残す

gzipbzip2コマンドは、指定したファイルを圧縮した後、元のファイルを削除してしまう。この場合、拡張子は自動的に付けられる。
下の例は、test.txtというファイルを用意した場合。

$ ls
test.txt
$ bzip2 test.txt; ls
test.txt.bz2

もし、元のファイルを残したいのであれば、-cオプションで標準出力に(圧縮後の)ファイルを出力する。この場合、拡張子を含め、出力ファイル名は自分で書く。

$ bzip2 -c test.txt > test.txt.bz2; ls
test.txt  test.txt.bz2

展開時に元のファイルを残したい場合や、圧縮ファイルに書き込み権限が無い場合などには、zcatbzcatコマンドが役に立つ。これらは、gunzipbunzip2-cオプションを付けたものと等価。

圧縮されたtarボールの作成と展開

tarコマンドで作成したtarボールを普通に圧縮することもできるが、これでは2段階の操作になるため、より簡単にできる操作が存在する。ただし、以下で述べるtarコマンドのzjといったオプションは、GNU版以外のtarでは動作しないかもしれない。
作成と展開以外の操作(例: tar jtvf test.tar.bz2)も同様に可能だが、省略。

.tar.gzファイルの作成
$ tar zcvf test.tar.gz [ファイルやディレクトリ...]
もしくは
$ tar cv [ファイルやディレクトリ...] | gzip > test.tar.gz
.tar.bz2ファイルの作成
$ tar jcvf test.tar.bz2 [ファイルやディレクトリ...]
もしくは
$ tar cv [ファイルやディレクトリ...] | bzip2 > test.tar.bz2
.tar.gzファイルの展開
$ tar zxvf test.tar.gz
もしくは
$ zcat test.tar.gz | tar xvf -
.tar.bz2ファイルの展開
$ tar jxvf test.tar.gz
もしくは
$ bzcat test.tar.bz2 | tar xvf -

tar+gzipとtar+bzip2の拡張子

それぞれ、「.tar.gz」と「.tar.bz2」が一般的だが、「.tgz」や「.tbz」という短縮形も存在する。

GUIで圧縮tarボールを作成/展開

file-rollerxarchiverなどのアプリケーションを使用することで、簡単に作成と展開ができる。実際にはNautilusThunarといったGUIファイルマネージャから右クリックメニューで「書庫の作成」「ここに展開する」といった項目を選択すればよいだけで、非常にお手軽。

関連記事:

*1:まとめる元のファイルのサイズが小さいものばかりであれば、ファイルシステムにおけるディスク領域の使用がある程度効率的になり、それにより多少は容量の節約になるかもしれないが...