Linux では、ソフトウェアをダウンロードしたり、スクリプトや大きなファイルを送受信したりするときに、複数のファイルを1つにまとめたり、サイズを小さくしたりすると扱いやすくなります。Windows の ZIP ファイルに近いことを、Linux では tar、gzip、bzip2 といったコマンドで行います。
この記事では、アーカイブ(まとめる)と圧縮(小さくする)の違いを押さえたうえで、3つのテキストファイルを使って、実際のファイルサイズを見ながら各コマンドの使い方を確認します。
- アーカイブ(tar)と圧縮(gzip、bzip2)の違い
tarでアーカイブを作成・展開・一覧表示し、ファイルを追加する方法gzip・bzip2で圧縮・解除し、圧縮前後のサイズを確認する方法tar -z・-jでアーカイブと圧縮を1つのコマンドで行う方法
ホスト名とユーザー名はどちらも hirotano です。以降の実行結果の日時とファイルサイズは、この環境で実行したものです。
アーカイブと圧縮について
アーカイブとは
アーカイブは、複数のファイルやディレクトリを1つのファイルにまとめることです。データの移動やバックアップに便利です。Linux では tar コマンドが広く使われています。tar は tape archive の略で、もともとシステムのデータをテープに保存するために使われていたことが名前の由来です。tar を使うと、複数のファイルを1つのアーカイブファイルにまとめることも、アーカイブを展開して元のファイルに戻すこともできます。
圧縮とは
圧縮は、ファイルのサイズを小さくすることです。ディスクの容量を節約でき、ネットワークで送るときの転送時間も短くなります。Linux では、gzip(GNU zip)や bzip2 といった圧縮ツールがよく使われます。
アーカイブと圧縮の違い
アーカイブはファイルを1つにまとめるだけで、サイズは小さくなりません。tar は、ファイルごとの管理情報も一緒に書き込むため、まとめた後のほうが大きくなることもあります。一方、圧縮はファイルサイズを小さくすることが目的です。
実際には、この2つを組み合わせて使うことが多くあります。複数のファイルを tar で1つにまとめてから圧縮すると、データの管理と転送がしやすくなります。
| アーカイブ | 圧縮 | |
|---|---|---|
| 目的 | 複数のファイルを1つにまとめる | ファイルのサイズを小さくする |
| コマンド | tar | gzip、bzip2 |
| 拡張子の例 | .tar | .gz、.bz2(.tar.gz、.tar.bz2) |
| サイズ | 小さくならない | 小さくなる |
この記事の画面は、実際の画面ではなく、実行時の画面から見るポイントを抜き出して描いたイメージです。長い出力は途中を省略しています。
アーカイブの基本(tar)
まず3つのテストファイルを作り、tar でアーカイブにまとめます。この時点では、データの圧縮は行いません。アーカイブを作った後のファイルサイズも確認します。
テストファイルを作成する
3つのテキストファイルを作成します。
作業ディレクトリ
$ echo "これはテストファイル1です" > file1.txt $ echo "これはテストファイル2です" > file2.txt $ echo "これはテストファイル3です" > file3.txt
各ファイルのバイト数を ls コマンドで確認します。
$ ls -l file1.txt file2.txt file3.txt
hirotano@hirotano:~$ ls -l file1.txt file2.txt file3.txt1-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file1.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file2.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 38 | 各ファイルのバイト数。3ファイルの合計は 114 バイト(38 バイト × 3) |
tar でアーカイブにまとめる
これらのファイルを、tar コマンドで1つのアーカイブにまとめます。
$ tar -cvf test_archive.tar file1.txt file2.txt file3.txt
使っているオプション -cvf の意味は次のとおりです。
| オプション | 意味 |
|---|---|
| c | create の略。新しいアーカイブを作成する |
| v | verbose の略。処理中のファイル名を表示する。必須ではないが、何が行われているかを確認できる |
| f | file の略。アーカイブファイルの名前を指定する。ここでは test_archive.tar |
1hirotano@hirotano:~$ tar -cvf test_archive.tar file1.txt file2.txt file3.txt2file1.txtfile2.txtfile3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -cvf ... | アーカイブ test_archive.tar を作成するコマンド |
| 2 | ファイル名の一覧 | -v により、アーカイブに入れたファイル名が1行ずつ表示される |
作成後、ls コマンドでアーカイブファイルのサイズを確認します。
$ ls -l test_archive.tar
hirotano@hirotano:~$ ls -l test_archive.tar1-rw-rw-r-- 1 hirotano hirotano 10240 Oct 21 13:53 test_archive.tar
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 10240 | アーカイブファイルのバイト数 |
元のファイルの合計が 114 バイトだったのに対し、アーカイブは 10240 バイトになりました。ファイルが小さい場合は、tar が付け加える分の割合が大きくなります。
tar のアーカイブには、ファイルごとの管理情報(ヘッダ)が付き、データは 512 バイト単位に切り上げて書き込まれます。さらに GNU tar は、アーカイブ全体を既定のブロッキング係数 20、つまり 10240 バイト(512 バイト × 20)の単位に切り上げて書き出します。そのため、今回のように小さなファイルをまとめると、サイズが 10240 バイトになります。ファイルが大きくなれば、この付け足しの割合は小さくなります。
アーカイブを展開する
作成したアーカイブを展開するには、次のように tar コマンドを使います。
$ tar -xvf test_archive.tar
| オプション | 意味 |
|---|---|
| x | extract の略。アーカイブを展開する |
| v | verbose の略。処理中のファイル名を表示する |
| f | file の略。展開するアーカイブファイルの名前を指定する |
1hirotano@hirotano:~$ tar -xvf test_archive.tar2file1.txtfile2.txtfile3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -xvf ... | アーカイブを現在のディレクトリに展開するコマンド |
| 2 | ファイル名の一覧 | 展開されたファイル名が表示される。実行したディレクトリに file1.txt、file2.txt、file3.txt が展開される |
展開先のディレクトリを指定することもできます。先に、展開先のディレクトリを作成します。
$ mkdir extract_here
-C オプションで展開先を指定して、アーカイブを展開します。この例では、extract_here ディレクトリに展開されます。
$ tar -xvf test_archive.tar -C extract_here
1hirotano@hirotano:~$ tar -xvf test_archive.tar -C extract_here2file1.txtfile2.txtfile3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | -C extract_here | 展開先のディレクトリを指定するオプション |
| 2 | ファイル名の一覧 | extract_here に展開されたファイル名が表示される |
展開先ディレクトリの内容を確認します。
$ ls extract_here/
hirotano@hirotano:~$ ls extract_here/1file1.txt file2.txt file3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 3つのファイル | extract_here の中に、3つのファイルが展開されている |
圧縮の基本(gzip、bzip2)
Linux では、gzip と bzip2 という2つの圧縮ツールがよく使われます。どちらも、指定したファイルを圧縮して新しいファイルを作り、元のファイルは削除します。ここでは、先ほど作った test_archive.tar を圧縮して、サイズを比べます。
gzip コマンド
gzip(GNU zip)は、ファイルを圧縮して、拡張子 .gz のファイルを作るツールです。
gzip で圧縮する
圧縮の前に、test_archive.tar のサイズを確認します。10240 バイトです。
$ ls -l test_archive.tar
hirotano@hirotano:~$ ls -l test_archive.tar1-rw-rw-r-- 1 hirotano hirotano 10240 Oct 21 15:08 test_archive.tar
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 10240 | 圧縮前のバイト数 |
gzip コマンドで圧縮します。
$ gzip test_archive.tar
実行すると、test_archive.tar が圧縮されて test_archive.tar.gz になり、元の test_archive.tar は削除されます。圧縮後のサイズを ls で確認すると、10240 バイトから 227 バイトになっています。
hirotano@hirotano:~$ gzip test_archive.tarhirotano@hirotano:~$ ls -l test_archive.tar.gz1-rw-rw-r-- 1 hirotano hirotano 227 Oct 21 15:08 test_archive.tar.gz
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 227 | 圧縮後のバイト数。10240 バイトから 227 バイトになった |
-l オプションを使うと、圧縮の状況を確認できます。
$ gzip -l test_archive.tar.gz
hirotano@hirotano:~$ gzip -l test_archive.tar.gz compressed uncompressed ratio uncompressed_name1 227 10240 98.1% test_archive.tar
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 227 / 10240 / 98.1% | 圧縮後のサイズ、圧縮前のサイズ、圧縮率(ratio)。圧縮率は 98.1% と表示されている |
gzip の圧縮を解除する
圧縮したファイルを元に戻すには、gunzip コマンドか gzip -d コマンドを使います。test_archive.tar.gz を解除します。
$ gunzip test_archive.tar.gz
もしくは、次のコマンドでも同じです。
$ gzip -d test_archive.tar.gz
圧縮を解除すると、.gz のファイルが削除され、元の test_archive.tar が戻ります。
hirotano@hirotano:~$ ls -l test*1-rw-rw-r-- 1 hirotano hirotano 227 Oct 21 15:08 test_archive.tar.gz2hirotano@hirotano:~$ gunzip test_archive.tar.gzhirotano@hirotano:~$ ls -l test*3-rw-rw-r-- 1 hirotano hirotano 10240 Oct 21 15:08 test_archive.tar
| No. | 表示 | 意味 |
|---|---|---|
| 1 | test_archive.tar.gz | 解除前。圧縮ファイルだけがあり、サイズは 227 バイト |
| 2 | gunzip ... | 圧縮を解除するコマンド |
| 3 | test_archive.tar | 解除後。元の .tar が戻り、サイズは 10240 バイト。.gz は消えている |
bzip2 コマンド
bzip2 は、ファイルを圧縮して、拡張子 .bz2 のファイルを作るツールです。一般に gzip よりも圧縮率が高い一方で、時間がかかることがあります。
bzip2 で圧縮する
gunzip で戻した test_archive.tar を圧縮します。圧縮前のサイズは、先ほどと同じ 10240 バイトです。
$ bzip2 test_archive.tar
実行すると、test_archive.tar が圧縮されて test_archive.tar.bz2 になり、元の test_archive.tar は削除されます。圧縮後のサイズを ls で確認すると、10240 バイトから 230 バイトになっています。
hirotano@hirotano:~$ bzip2 test_archive.tarhirotano@hirotano:~$ ls -l test_archive.tar.bz21-rw-rw-r-- 1 hirotano hirotano 230 Oct 21 15:08 test_archive.tar.bz2
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 230 | 圧縮後のバイト数。10240 バイトから 230 バイトになった |
圧縮率を確認したいときは、-v オプションを付けて実行します。
$ bzip2 -v test_archive.tar
hirotano@hirotano:~$ bzip2 -v test_archive.tar1 test_archive.tar: 44.522:1, 0.180 bits/byte, 97.75% saved, 10240 in, 230 out.
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 97.75% saved | 圧縮で減った割合。10240 in, 230 out は、入力 10240 バイトが 230 バイトになったことを示す |
圧縮率は 97.75% と表示されました。
gzip -l の 98.1% と bzip2 -v の 97.75% は、計算の基準が同じとは限らないため、数字をそのまま並べて優劣を決めることはできません。bzip2 -v の 97.75% は、10240 バイトが 230 バイトになった割合((10240 − 230) ÷ 10240)と一致します。一方、gzip -l の 98.1% は、ls で見た 227 バイトから同じ式で求めた値(約 97.8%)とは一致しません。確実に比べるには、ls -l で見たファイルサイズを使います。今回のファイルでは、gzip が 227 バイト、bzip2 が 230 バイトで、その差は 3 バイトでした。
bzip2 の圧縮を解除する
圧縮したファイルを元に戻すには、bunzip2 コマンドか bzip2 -d コマンドを使います。test_archive.tar.bz2 を解除します。
$ bunzip2 test_archive.tar.bz2
もしくは、次のコマンドでも同じです。
$ bzip2 -d test_archive.tar.bz2
圧縮を解除すると、.bz2 のファイルが削除され、元の test_archive.tar が戻ります。
hirotano@hirotano:~$ ls -l test*1-rw-rw-r-- 1 hirotano hirotano 230 Oct 21 15:08 test_archive.tar.bz22hirotano@hirotano:~$ bunzip2 test_archive.tar.bz2hirotano@hirotano:~$ ls -l test*3-rw-rw-r-- 1 hirotano hirotano 10240 Oct 21 15:08 test_archive.tar
| No. | 表示 | 意味 |
|---|---|---|
| 1 | test_archive.tar.bz2 | 解除前。圧縮ファイルだけがあり、サイズは 230 バイト |
| 2 | bunzip2 ... | 圧縮を解除するコマンド |
| 3 | test_archive.tar | 解除後。元の .tar が戻り、サイズは 10240 バイト。.bz2 は消えている |
アーカイブと圧縮の組み合わせ
ここまでのように、ファイルを1つのアーカイブにまとめてから圧縮することはよくあります。tar のオプションを使うと、アーカイブの作成と圧縮を1回のコマンドで行えます。
gzip を使う場合
file1.txt、file2.txt、file3.txt を、test_archive.tar.gz という名前でアーカイブして圧縮します。tar の -z オプションを付けると、アーカイブを gzip で圧縮します。
$ tar -cvzf test_archive.tar.gz file1.txt file2.txt file3.txt
hirotano@hirotano:~$ ls -l file*-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file1.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file2.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file3.txt1hirotano@hirotano:~$ tar -cvzf test_archive.tar.gz file1.txt file2.txt file3.txtfile1.txtfile2.txtfile3.txthirotano@hirotano:~$ ls -l test*2-rw-rw-r-- 1 hirotano hirotano 210 Oct 21 16:39 test_archive.tar.gzhirotano@hirotano:~$ ls -l file*-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file1.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file2.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -cvzf ... | アーカイブの作成と gzip での圧縮を、1つのコマンドで行う |
| 2 | 210 | できあがった test_archive.tar.gz のサイズ。元の3ファイルは、そのまま残っている |
tar -cvf のあとに gzip を実行したときは 227 バイトで、tar -cvzf では 210 バイトでした。gzip は、ファイルを指定して圧縮すると、元のファイル名(test_archive.tar)を圧縮ファイルの中に記録するのが既定の動作です。この名前の長さ(終端を含めて 17 バイト)が、17 バイトの差と一致します。圧縮データそのものは同じです。
bzip2 を使う場合
同じ3つのファイルを、test_archive.tar.bz2 という名前でアーカイブして圧縮します。tar の -j オプションを付けると、アーカイブを bzip2 で圧縮します。
$ tar -cvjf test_archive.tar.bz2 file1.txt file2.txt file3.txt
hirotano@hirotano:~$ ls -l file*-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file1.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file2.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file3.txt1hirotano@hirotano:~$ tar -cvjf test_archive.tar.bz2 file1.txt file2.txt file3.txtfile1.txtfile2.txtfile3.txthirotano@hirotano:~$ ls -l test*2-rw-rw-r-- 1 hirotano hirotano 230 Oct 21 16:51 test_archive.tar.bz2hirotano@hirotano:~$ ls -l file*-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file1.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file2.txt-rw-rw-r-- 1 hirotano hirotano 38 Oct 21 13:30 file3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -cvjf ... | アーカイブの作成と bzip2 での圧縮を、1つのコマンドで行う |
| 2 | 230 | できあがった test_archive.tar.bz2 のサイズ。bzip2 を別に実行したときと同じ 230 バイト |
GNU tar は、圧縮されたアーカイブを読むとき、圧縮の形式を自動で判別します。そのため、.tar.gz や .tar.bz2 を展開・一覧表示するときは、-z や -j を付けずに tar -xvf や tar -tf と書けます。
その他のオプション
アーカイブの内容を一覧表示する
tar の -t オプションで、アーカイブの内容を表示できます。展開する前に中身を知りたいときや、特定のファイルが入っているかを確認したいときに便利です。
$ tar -tf test_archive.tar
1hirotano@hirotano:~$ tar -tf test_archive.tar2file1.txtfile2.txtfile3.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -tf ... | アーカイブを展開せずに、中身だけを一覧表示するコマンド |
| 2 | ファイル名の一覧 | test_archive.tar には、file1.txt、file2.txt、file3.txt の3つが入っている |
アーカイブにファイルを追加する
tar の -r オプションで、既存のアーカイブに新しいファイルを追加できます。ここでは、file1.txt から file3.txt が入った test_archive.tar に、新しく作る file4.txt を追加して、-t で中身を確認します。
新しいファイルを作成します。
$ echo "This is the content of file4.txt" > file4.txt
既存のアーカイブに追加します。
$ tar -rvf test_archive.tar file4.txt
アーカイブの内容を一覧表示します。
$ tar -tf test_archive.tar
hirotano@hirotano:~$ echo "This is the content of file4.txt" > file4.txt1hirotano@hirotano:~$ tar -rvf test_archive.tar file4.txtfile4.txthirotano@hirotano:~$ tar -tf test_archive.tarfile1.txtfile2.txtfile3.txt2file4.txt
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tar -rvf ... | 既存のアーカイブに file4.txt を追加するコマンド |
| 2 | file4.txt | 一覧の最後に、追加したファイルが表示されている |
.tar.gz や .tar.bz2 のように圧縮されたアーカイブは、GNU tar では変更できません。-r(追加)、-u(更新)、--delete(削除)は、圧縮していない .tar に対して使います。
圧縮レベルを指定する
gzip と bzip2 では、-1 から -9 までの数字で、圧縮の設定を変えられます。次のように、オプションを付けて実行します。
$ gzip -9 test_archive.tar
| gzip | bzip2 | |
|---|---|---|
| -1 | 最も速い圧縮(圧縮率は低め) | ブロックサイズを 100k にする |
| -9 | 最も遅い圧縮(圧縮率は最良) | ブロックサイズを 900k にする |
| 既定 | -6 | -9 |
gzip の既定は -6 で、圧縮率を高めに、速度を犠牲にする設定です。bzip2 の -1 から -9 は、圧縮の速さを切り替えるものではなく、一度に処理するブロックのサイズ(100k から 900k)を選ぶものです。bzip2 の --fast も、処理が大きく速くなるわけではありません。特別な理由がなければ、既定のままで問題ありません。
まとめ
tar はファイルを1つにまとめるコマンド、gzip と bzip2 はファイルを小さくするコマンドです。tar の -z や -j を使えば、まとめる処理と小さくする処理を1回で行えます。今回の検証で、3つのテキストファイルがどのサイズになったかを、次の表にまとめます。
| 操作 | コマンド | サイズ |
|---|---|---|
| 元の3ファイル | — | 114 バイト(38 × 3) |
| tar でまとめる | tar -cvf | 10240 バイト |
| gzip で圧縮 | gzip | 227 バイト |
| bzip2 で圧縮 | bzip2 | 230 バイト |
| まとめて gzip で圧縮 | tar -cvzf | 210 バイト |
| まとめて bzip2 で圧縮 | tar -cvjf | 230 バイト |
| コマンド | 用途 |
|---|---|
| tar -cvf | アーカイブを作成する |
| tar -xvf | アーカイブを展開する(-C で展開先を指定) |
| tar -tf | アーカイブの内容を一覧表示する |
| tar -rvf | 圧縮していないアーカイブにファイルを追加する |
| gzip / gunzip | 圧縮する/圧縮を解除する(gzip -d でも解除できる) |
| bzip2 / bunzip2 | 圧縮する/圧縮を解除する(bzip2 -d でも解除できる) |
| tar -z / -j | アーカイブの作成と gzip/bzip2 での圧縮を同時に行う |
コメント