Linuxでは、新しいソフトウェアをダウンロードしてインストールし、さまざまなスクリプトや大きなファイルを送受信することがあります。この場合、これらのファイルを圧縮して1つのファイルにまとめると扱いが非常に簡単になります。
WindowsユーザはZIPファイルを作成することでこれらのプロセスに親しんでいるかもしれませんが、Linux環境でも同様のタスクを実行するためのツールが提供されています。この章では、Linuxでのアーカイブと圧縮の基本的な概念について解説します。
アーカイブと圧縮について
アーカイブとは?
アーカイブは、複数のファイルやディレクトリを一つのファイルにまとめることです。データの移動やバックアップに便利です。Linuxでは、tar(テープアーカイブの略。昔、システムデータを保存するためにテープを使用していた由来)コマンドが広く用いられており、これによりユーザーは複数のファイルを一つのアーカイブファイルにまとめたり、逆にアーカイブを解凍して元のファイルに戻したりすることができます。
圧縮とは?
圧縮により、ファイルのサイズを減らすことができます。これによりディスクスペースを節約し、外部へのデータ転送時間を短縮することができます。Linuxでは、gzip(GNU zip)やbzip2などの圧縮ツールが提供されており、これらのツールを使用することでファイルを効率的に圧縮・解凍することができます。
アーカイブと圧縮の違いは?
アーカイブはファイルの集合を一つのファイルにまとめるだけで、ファイルサイズは減りません(むしろ、オーバーヘッドがあり、トータルでは増えます)。一方、圧縮はファイルサイズを減らすことを目的としています。しかし、アーカイブと圧縮は組み合わせて使用されることが多く、複数のファイルを一つのアーカイブにまとめてから圧縮することで、データ管理や転送を効率的に行うことができます。
これから、 tar, gzip, bzip2コマンドを使ったアーカイブと圧縮について、詳しく見ていきます。
アーカイブの基本 (tar)
tarコマンドは、Linux上でよく使用されるアーカイブ用のコマンドです。このコマンドで、複数のファイルやディレクトリをひとつのファイルにまとめたり、アーカイブファイルを展開して元のファイルに戻したりすることができます。
まずは3つのテストファイルを作成し、それらをアーカイブにまとめてみます。このアーカイブにはデータの圧縮は含まれていません。アーカイブ作成後のファイルサイズも確認してみます。
アーカイブの作成
まず、3つのテキストファイルを作成します。
$ echo “これはテストファイル1です” > file1.txt
$ echo “これはテストファイル2です” > file2.txt
$ echo “これはテストファイル3です” > file3.txt
各ファイルの実際のバイト数をlsコマンドを使って確認します。
$ ls -l file1.txt file2.txt file3.txt

各ファイルのバイト数の合計は、114バイト(38バイト×3ファイル)です。
それでは、tarコマンドを使ってこれらのファイルをアーカイブにまとめます。
$ tar -cvf test_archive.tar file1.txt file2.txt file3.txt

上の tar コマンドで使用しているオプション( -cvf ) は下記の意味です。
- c(create):新しいアーカイブを作成します。
- v(verbose):詳細モードで、実行中のプロセスを表示します(これはオプションで、必要ではありませんが、何が起こっているのかを見るのに役立ちます)。
- f(file):指定したファイル名でアーカイブファイル作成します。ここでは test_archive.tar がアーカイブファイル名です。
アーカイブを作成した後、lsコマンドを使ってアーカイブファイルのサイズを確認します。
$ ls -l test_archive.tar

アーカイブ前のファイルサイズの合計とアーカイブ後のファイルサイズを比較すると、アーカイブファイルのサイズは、オリジナルのファイルサイズの合計よりも大きくなっています。(114バイト→10240バイト)。(元のファイルサイズが小さいので、オーバヘッドの割合が大きくなっています。)
アーカイブの展開
作成したアーカイブファイルを展開するには、下記のような tar コマンドを使用します:
$ tar -xvf test_archive.tar

上の tar コマンドで使用しているオプション( -xvf ) は下記の意味です。
- x(extract):アーカイブを展開します。
- v(verbose):詳細モードで、実行中のプロセスを表示します。
- f(file):展開するアーカイブファイルの名前を指定します。
実行したディレクトリにファイル(file1.txt file2.txt file3.txt)が展開されています。
展開先を指定することもできます。展開先のディレクトリを作成します。
$ mkdir extract_here
tarコマンドの -C オプションを使用して、展開先ディレクトリを指定し、アーカイブを展開します。この例では、extract_hereディレクトリにアーカイブが展開されます。
$ tar -xvf test_archive.tar -C extract_here

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

圧縮の基本 (gzip, bzip2)
Linuxでは、gzipとbzip2という2つの圧縮ツールがよく使用されます。
gzipコマンド
gzip(GNU zip)は、ファイルを圧縮し、.gz拡張子を持つ新しいファイルを作成するツールです。ここでは、gzipコマンドの基本的な使い方を確認します。
gzipによる圧縮
上のアーカイブで作成した test_archive.tar を圧縮します。まず、test_archive.tar のファイルサイズを確認します。10240バイトです。
$ ls -l test_archive.tar

gzipコマンドを使ってtest_archive.tarを圧縮します。
$ gzip test_archive.tar
このコマンドを実行すると、test_archive.tar は test_archive.tar.gz に圧縮され、元のtarアーカイブは削除されます。
圧縮後のアーカイブサイズをlsコマンドで確認すると、元の10240バイトから227バイトへ圧縮されていることが確認できます。

gzipコマンドの -l オプションを使って圧縮率を確認することもできます。
$ gzip -l test_archive.tar.gz

圧縮率は98.1%であることがわかります。
gzipによる圧縮解除
圧縮ファイルを展開するには、gunzipコマンドまたはgzip -dコマンドを使用します。それでは、test_archive.tar.gz を解凍します。
$ gunzip test_archive.tar.gz
もしくは
$ gzip -d test_archive.tar.gz
下記のスクリーンショットにあるとおり、圧縮ファイルが展開されていることがわかります。展開されたファイルは削除されます。

bzip2コマンド
bzip2は一般的にはgzipよりも高い圧縮率を提供しますが、少し時間がかかることがあります。
bzip2による圧縮
bzip2コマンドを使って、上のアーカイブで作成した test_archive.tar を圧縮します。まず、test_archive.tar のファイルサイズを確認します。10240バイトです。

bzip2コマンドを使ってtest_archive.tarを圧縮します。
$ bzip2 test_archive.tar
このコマンドを実行すると、test_archive.tar は test_archive.tar.bz2 に圧縮され、元のtarアーカイブは削除されます。
圧縮後のアーカイブサイズをlsコマンドで確認すると、元の10240バイトから230バイトへ圧縮されていることが確認できます。

圧縮率を確認したい場合は、-vオプションを使用してbzip2コマンドを実行します。
$ bzip2 -v test_archive.tar

圧縮率は97.75%であることがわかります。(今回のサンプルファイルではgzipよりも圧縮率が悪かったです)
bzip2による圧縮解除
圧縮ファイルを展開するには、bunzip2コマンドまたはbzip2 -dコマンドを使用します。それでは、test_archive.tar.bz2 を解凍します。
$ bunzip2 test_archive.tar.bz2
もしくは
$ bzip2 -d test_archive.tar.bz2
下記のスクリーンショットにあるとおり、圧縮ファイルが展開されていることがわかります。展開されたファイルは削除されます。

アーカイブと圧縮の組み合わせ
上記のように、ファイルやディレクトリを一つのアーカイブファイルにまとめた後、そのアーカイブを圧縮することがよくあります。
tarコマンドのオプションを使用して、アーカイブと圧縮を一度に行うこともできます。これは非常に便利です。
gzipを使用する場合
file1.txt, file2.txt, file3.txtという3つのテキストファイルをtest_archive.tar.gzという名前でアーカイブして圧縮する場合を考えます。
この場合、tarコマンドの-zオプションを使用して、指定されたファイルをアーカイブし、そのアーカイブをgzipで圧縮します。
$ tar -cvzf test_archive.tar.gz file1.txt file2.txt file3.txt

bzip2を使用する場合
file1.txt, file2.txt, file3.txtという3つのテキストファイルをtest_archive.tar.bz2という名前でアーカイブして圧縮する場合を考えます。
この場合、tarコマンドの-jオプションを使用して、指定されたファイルをアーカイブし、そのアーカイブをbzip2で圧縮します。
$ tar -cvjf test_archive.tar.bz2 file1.txt file2.txt file3.txt

その他オプション
アーカイブの一覧表示
tarコマンドの-tオプションを使用して、アーカイブの内容を表示できます。アーカイブを展開する前にその内容を知りたい場合や、特定のファイルやディレクトリがアーカイブに含まれているかを確認する場合に便利です。
$ tar -tf test_archive.tar

実行結果として、test_archive.tarというアーカイブファイルにはfile1.txt、file2.txt、file3.txtという3つのファイルが含まれていることがわかります。
アーカイブにファイルを追加
tarコマンドの-rオプションを使用することで、既存のアーカイブに新しいファイルを追加することができます。新しくfile4.txtというファイルを作成し、file1.txt,file2.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

test_archive.tarの中身を一覧表示すると、file1.txt, file2.txt, file3.txtに加え、file4.txtがアーカイブに含まれていることが確認できます。
圧縮レベルの指定
gzipやbzip2では、-1から-9までの数字を使用して圧縮レベルを指定できます。-1は最速の圧縮、-9は最高の圧縮を意味します。特段の理由がない限り、デフォルトの圧縮率をおすすめします。
$ gzip -9 test_archive.tar
コメント