【Linux】アーカイブと圧縮: tar, gzip, bzip2の使い方(初心者向け)

Linux では、ソフトウェアをダウンロードしたり、スクリプトや大きなファイルを送受信したりするときに、複数のファイルを1つにまとめたり、サイズを小さくしたりすると扱いやすくなります。Windows の ZIP ファイルに近いことを、Linux では tar、gzip、bzip2 といったコマンドで行います。

この記事では、アーカイブ(まとめる)と圧縮(小さくする)の違いを押さえたうえで、3つのテキストファイルを使って、実際のファイルサイズを見ながら各コマンドの使い方を確認します。

この記事でわかること
  1. アーカイブ(tar)と圧縮(gzip、bzip2)の違い
  2. tar でアーカイブを作成・展開・一覧表示し、ファイルを追加する方法
  3. gzip・bzip2 で圧縮・解除し、圧縮前後のサイズを確認する方法
  4. tar -z・-j でアーカイブと圧縮を1つのコマンドで行う方法
検証環境

ホスト名とユーザー名はどちらも hirotano です。以降の実行結果の日時とファイルサイズは、この環境で実行したものです。

アーカイブと圧縮について

アーカイブとは

アーカイブは、複数のファイルやディレクトリを1つのファイルにまとめることです。データの移動やバックアップに便利です。Linux では tar コマンドが広く使われています。tar は tape archive の略で、もともとシステムのデータをテープに保存するために使われていたことが名前の由来です。tar を使うと、複数のファイルを1つのアーカイブファイルにまとめることも、アーカイブを展開して元のファイルに戻すこともできます。

圧縮とは

圧縮は、ファイルのサイズを小さくすることです。ディスクの容量を節約でき、ネットワークで送るときの転送時間も短くなります。Linux では、gzip(GNU zip)や bzip2 といった圧縮ツールがよく使われます。

アーカイブと圧縮の違い

アーカイブはファイルを1つにまとめるだけで、サイズは小さくなりません。tar は、ファイルごとの管理情報も一緒に書き込むため、まとめた後のほうが大きくなることもあります。一方、圧縮はファイルサイズを小さくすることが目的です。

実際には、この2つを組み合わせて使うことが多くあります。複数のファイルを tar で1つにまとめてから圧縮すると、データの管理と転送がしやすくなります。

file1.txtfile2.txtfile3.txt合計 114 バイトtarまとめるtest_archive.tar10240 バイトgzip / bzip2縮めるtest_archive.tar.gz227 バイトtest_archive.tar.bz2230 バイトtar -z / -j なら、この2段階を1つのコマンドで実行できる
図1 アーカイブ(tar)でまとめてから、圧縮(gzip、bzip2)で小さくする
アーカイブ圧縮
目的複数のファイルを1つにまとめるファイルのサイズを小さくする
コマンドtargzip、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
図2 3つのテストファイルのサイズ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
138各ファイルのバイト数。3ファイルの合計は 114 バイト(38 バイト × 3)

tar でアーカイブにまとめる

これらのファイルを、tar コマンドで1つのアーカイブにまとめます。

$ tar -cvf test_archive.tar file1.txt file2.txt file3.txt

使っているオプション -cvf の意味は次のとおりです。

オプション意味
ccreate の略。新しいアーカイブを作成する
vverbose の略。処理中のファイル名を表示する。必須ではないが、何が行われているかを確認できる
ffile の略。アーカイブファイルの名前を指定する。ここでは test_archive.tar
ターミナル画面イメージ
1hirotano@hirotano:~$ tar -cvf test_archive.tar file1.txt file2.txt file3.txt2file1.txtfile2.txtfile3.txt
図3 tar でアーカイブを作成した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -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
図4 アーカイブファイルのサイズ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
110240アーカイブファイルのバイト数

元のファイルの合計が 114 バイトだったのに対し、アーカイブは 10240 バイトになりました。ファイルが小さい場合は、tar が付け加える分の割合が大きくなります。

補足:なぜ 10240 バイトになるのか

tar のアーカイブには、ファイルごとの管理情報(ヘッダ)が付き、データは 512 バイト単位に切り上げて書き込まれます。さらに GNU tar は、アーカイブ全体を既定のブロッキング係数 20、つまり 10240 バイト(512 バイト × 20)の単位に切り上げて書き出します。そのため、今回のように小さなファイルをまとめると、サイズが 10240 バイトになります。ファイルが大きくなれば、この付け足しの割合は小さくなります。

アーカイブを展開する

作成したアーカイブを展開するには、次のように tar コマンドを使います。

$ tar -xvf test_archive.tar
オプション意味
xextract の略。アーカイブを展開する
vverbose の略。処理中のファイル名を表示する
ffile の略。展開するアーカイブファイルの名前を指定する
ターミナル画面イメージ
1hirotano@hirotano:~$ tar -xvf test_archive.tar2file1.txtfile2.txtfile3.txt
図5 アーカイブを展開した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -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
図6 展開先を指定して展開した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1-C extract_here展開先のディレクトリを指定するオプション
2ファイル名の一覧extract_here に展開されたファイル名が表示される

展開先ディレクトリの内容を確認します。

$ ls extract_here/
ターミナル画面イメージ
hirotano@hirotano:~$ ls extract_here/1file1.txt  file2.txt  file3.txt
図7 展開先ディレクトリの内容(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
13つのファイル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
図8 圧縮前のアーカイブのサイズ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
110240圧縮前のバイト数

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
図9 gzip で圧縮した後のサイズ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1227圧縮後のバイト数。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
図10 gzip -l の表示(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1227 / 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
図11 gunzip で圧縮を解除した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1test_archive.tar.gz解除前。圧縮ファイルだけがあり、サイズは 227 バイト
2gunzip ...圧縮を解除するコマンド
3test_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
図12 bzip2 で圧縮した後のサイズ(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1230圧縮後のバイト数。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.
図13 bzip2 -v の表示(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
197.75% saved圧縮で減った割合。10240 in, 230 out は、入力 10240 バイトが 230 バイトになったことを示す

圧縮率は 97.75% と表示されました。

補足:gzip と bzip2 の結果を比べるとき

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 バイトでした。

ファイルサイズ(棒の長さは実際のバイト数に比例)元の3ファイル114 バイトtar10240 バイトtar.gz227 バイトtar.bz2230 バイト
図14 今回のファイルサイズの比較

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
図15 bunzip2 で圧縮を解除した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1test_archive.tar.bz2解除前。圧縮ファイルだけがあり、サイズは 230 バイト
2bunzip2 ...圧縮を解除するコマンド
3test_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
図16 tar -z でアーカイブと圧縮を同時に行った画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -cvzf ...アーカイブの作成と gzip での圧縮を、1つのコマンドで行う
2210できあがった test_archive.tar.gz のサイズ。元の3ファイルは、そのまま残っている
補足:tar -z と gzip を別々に実行したときのサイズ差

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
図17 tar -j でアーカイブと圧縮を同時に行った画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -cvjf ...アーカイブの作成と bzip2 での圧縮を、1つのコマンドで行う
2230できあがった 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
図18 アーカイブの内容を一覧表示した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -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
図19 アーカイブにファイルを追加した画面(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1tar -rvf ...既存のアーカイブに file4.txt を追加するコマンド
2file4.txt一覧の最後に、追加したファイルが表示されている
注意:圧縮したアーカイブには追加できません

.tar.gz や .tar.bz2 のように圧縮されたアーカイブは、GNU tar では変更できません。-r(追加)、-u(更新)、--delete(削除)は、圧縮していない .tar に対して使います。

圧縮レベルを指定する

gzip と bzip2 では、-1 から -9 までの数字で、圧縮の設定を変えられます。次のように、オプションを付けて実行します。

$ gzip -9 test_archive.tar
gzipbzip2
-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 -cvf10240 バイト
gzip で圧縮gzip227 バイト
bzip2 で圧縮bzip2230 バイト
まとめて gzip で圧縮tar -cvzf210 バイト
まとめて bzip2 で圧縮tar -cvjf230 バイト
コマンド用途
tar -cvfアーカイブを作成する
tar -xvfアーカイブを展開する(-C で展開先を指定)
tar -tfアーカイブの内容を一覧表示する
tar -rvf圧縮していないアーカイブにファイルを追加する
gzip / gunzip圧縮する/圧縮を解除する(gzip -d でも解除できる)
bzip2 / bunzip2圧縮する/圧縮を解除する(bzip2 -d でも解除できる)
tar -z / -jアーカイブの作成と gzip/bzip2 での圧縮を同時に行う

コメント