6.7 ファイルのアーカイブと圧縮
Linux Essentials Online Text | 2021/07/21

アーカイブとは、複数のファイルを1つのファイルにまとめることを指し、ファイルサイズを小さくすることを「圧縮する」と言います。ファイルを別の場所に移動したり、ネットワーク上でやり取りする際、ファイルはアーカイブされている方が効率的で、圧縮されているとより効率的です。

いくつかのサービスでは「アーカイブすること」の中に「ファイルを圧縮すること」が含まれていたりしますが、厳密には異なります。LPI試験においても、「アーカイブすること」と「ファイルを圧縮すること」は区別して理解するようにしてください。

tarコマンドによるアーカイブと圧縮(tar)

tarコマンドは古くからUNIX系のOSで使用されている書庫管理プログラムです。

書式:

tar オプション アーカイブ後ファイル名 アーカイブ元
tar オプション アーカイブファイル

主なオプション:

-f必ず指定するオプションです。
アーカイブ時は生成するファイル名を、展開時は対象ファイル名を指定します。
-vアーカイブ時、展開時どちらでも使用できます。
処理内容を詳細表示します。
-c対象をアーカイブします。
-x対象を展開(解凍)する。
-t対象の内容を表示します。
-x(展開)と同じですが、実際には解凍されません。
-zアーカイブファイルをgzip圧縮したい時、
gzip形式の圧縮ファイルを展開する際に指定します。
-jアーカイブファイルをbzip2圧縮したい時、
bzip2形式の圧縮ファイルを展開する際に指定します。
-Jアーカイブファイルをxz圧縮したい時、
xz形式の圧縮ファイルを展開する際に指定します。

<tarコマンドの実行例>

cpコマンドの時にコピーした「log」ディレクトリをアーカイブしてみましょう。

$ cp -r /var/log
$ tar cvf log.tar log
$ ls
hosts.new  log  log.tar  touch_file

tarコマンドは、複数のオプションを組み合わせて使用します。
アーカイブするには「‐c」と「-f」が必要です。アーカイブするための「‐c」、どのような名前のアーカイブファイルにするかを指定するための「-f」です。「-v」オプションを使うとアーカイブ対象となるファイルが画面上に表示されます。このオプションは指定してもしなくても問題ありません。

上記の例では「cvf」と指定しています。「c(アーカイブする)・v(詳細を表示する)・f(ファイルを指定する)」を組み合わせたもので「詳細表示しながら/home/logディレクトリを、log.tarというファイル名でアーカイブせよ」という指示になります。

続いて、アーカイブファイル「log.tar」を展開してみます。「log」ディレクトリを削除し、「-t」オプションを試してみます。

$ rm -rf log
$ ls
hosts.new  log.tar  touch_file
$ tar tf log.tar
$ ls
hosts.new  log.tar  touch_file

「-t」は、アーカイブファイルの中身を確認するオプションです。この場合もファイル名を指定するため「-f」オプションが必要です。「-v」はあってもかまいませんが、「-t」と同じ効果ですのであってもなくても動作は変わりません。テスト的に展開するだけですので、実行後「log」ディレクトリは展開されていないことが確認できます。

実際に展開するときは「-x」オプションを使用します。

$ tar xvf log.tar
$ ls
hosts.new  log  log.tar  touch_file

展開するための「-x」と展開する対象のファイルを指定するための「-f」オプションが必要です。「-v」オプションを使うと展開されたファイルが画面上に表示されます。このオプションは指定してもしなくても問題ありません。

上記例では「xvf」と指定しています。これは「x(展開する)・v(詳細を表示する)・f(ファイルを指定する)」を組み合わせたものです。つまり、「詳細を表示しながらlog.tarを展開せよ」という指示です。

ちなみに、tarコマンドのオプションは「-(ハイフン)」の省略と、順不同の指定が可能です。

また、tarコマンドはアーカイブするだけでなく、オプションを用いることで様々な圧縮形式で圧縮することができます。使用方法は上記のアーカイブで使用したコマンドに対応する圧縮ファイル形式のオプションを追加するだけです。つまり、gzipなら「z」、bzip2なら「j」、xzなら「J」を追加して使用します。

$ tar cvfz log.tar.gz log
$ ls
hosts.new  log  log.tar  log.tar.gz  touch_file
$ tar cvfj log.tar.bz2 log
$ ls
hosts.new  log  log.tar  log.tar.bz2  log.tar.gz  touch_file
$ tar cvfJ log.tar.xz log
$ ls
hosts.new  log  log.tar  log.tar.bz2  log.tar.gz  log.tar.xz  touch_file

上記では、gzip圧縮の際は「log.tar.gz」、bzip2圧縮では「log.tar.bz2」、xz圧縮では「log.tar.xz」というファイルを生成しますが、これらのファイル名は実行者が命名しています。
ここで指定するファイル名は、拡張子を含め単なる名前です。ファイル形式と関連性はありません。そのため、どのような名前でも自由に命名することが可能で「.tar.gz」等を付与して命名しなくてもよいのです。圧縮ファイル形式と拡張子が合っていないからといってコマンドが実行できなくなるということはありません。

しかしながら、一般にtarを使った圧縮ファイルは、gzipの場合は「.tar.gz」、bzip2なら「.tar.bz2」、xzなら「.tar.xz」という拡張子を付与したファイル名をつけます。

これは、利用者がファイル名を見た時に、ファイル名からファイル形式を判断しやすくするためです。適切なファイル名の命名はマナーといえます。

zipコマンドによる圧縮(zip,unzip)

zip形式のファイル圧縮はWindowsOSがデフォルトの状態で対応していることもあり、Windowsでよく使われます。Linuxにもzipコマンドがありzip形式を扱うことはできます。
が、実はあまり使用しません。主にWindowsとのファイルのやり取りをするために使われることがほとんどです。

書式

zip [オプション] アーカイブ後ファイル名 アーカイブ元

主なオプション:

-e作成する圧縮ファイルにパスワードを設定します。
-rディレクトリを再帰的に圧縮します。

<zipコマンドの実行例>

$ zip backup.zip ~/*

上記は、ホームディレクトリ全体を「backup.zip」という名前でzip圧縮をするコマンドを実行しています。

なお、zip形式のファイルを解凍する場合は、unzipコマンドを使用します。

書式:

unzip [オプション] アーカイブファイル

主なオプション:

-c標準出力に展開結果を表示します。
-lアーカイブの中身を表示します。
-t展開テストをします。

<unzipコマンドの実行例>

$ unzip backup.zip

gzipコマンドによる圧縮(gzip,gunzip)

gzipは一般的な圧縮率をもった標準的な圧縮方式です。古くから使用されている圧縮形式で、Linuxに限らず多くのUnix系OSの殆どで扱うことができます。
gzip圧縮するにはgzipコマンドを使用します。gzipコマンドで圧縮したファイルの拡張子は「.gz」になります。

書式:

gzip [オプション] ファイル名

主なオプション:

-rディレクトリ内のファイルを全て圧縮します。
-c標準出力へ出力します。
-d圧縮ファイルを展開します。

<gzipコマンドの実行例>

$ gzip hosts.new
$ gzip -c touch_file > touch_file.gz

いずれも、gzip圧縮することができるコマンドです。1行目が一般的な実行方法です。実行すると「hosts.new」がgzip圧縮されて「hosts.new.gz」になります。元のファイルは残りません。
元ファイルを残したい場合は2行目のようにリダイレクトを使用します。

なお、gzipコマンドではディレクトリを圧縮することができません。「-r」オプションがありますが、このオプションは指定したディレクトリの中のファイルを1つ1つgzip圧縮するものです。ディレクトリ構造を維持した状態で圧縮したい場合はtarコマンドを使用します。

gzip形式のファイルを解凍する場合は、gzipの「-d」オプションを使うか、gunzipコマンドを使用します。

書式: gunzip ファイル名

<gunzipコマンドの実行例>

$ gunzip hosts.new.gz

上記は、「hosts.new.gz」を解凍するコマンドです。実行すると「 hosts.new」が生成されますが、圧縮時と同様に元ファイルである「hosts.new.gz」は残りません。

bzip2コマンドによる圧縮(bzip2,bunzip)

bzip2はgzipと比較して圧縮率が高いのが特徴ですが、その分処理に時間がかかります。比較的大きなサイズのファイルを圧縮するために使用することが多く、ログなどをバックアップやカーネルのソースコードの圧縮に採用されるケースが多いと言えます。
bzip2圧縮するにはbzip2コマンドを使用します。bzip2コマンドで圧縮したファイルの拡張子は「.bz2」になります。

書式:

bzip2 [オプション] ファイル名

主なオプション:

-c標準出力へ出力します。
-k圧縮元のファイルを残します。
-d圧縮ファイルを展開します。

<bzip2コマンドの実行例>

$ bzip2 hosts.new
$ bzip2 -c touch_file > touch_file.bz2
$ bzip2 -k touch_file

使用方法、挙動ともにgzipとほぼ同じですが、使えるオプションが若干異なるので注意してください。

なお、1行目を実行すると「hosts.new」がbzip2圧縮されて「hosts.new.bz2」になります。gzipコマンドと同様元ファイルが残らないため、残すには2行目のようにリダイレクトを用います。これもgzipコマンドと同じです。
ただし、bzip2コマンドには「-k」オプションがあり、このオプションを用いることで元ファイルを残して圧縮ファイルを作成することができます。

bzip2コマンドも、gzipコマンドと同様にディレクトリを圧縮することはできません。そのためディレクトリ構造を維持したまま圧縮したい場合は、tarコマンドを使用するしかありません。また、「-r」オプションもありませんので注意が必要です。
なお、bzip2形式のファイルを解凍する場合は、bzip2の「-d」オプションを使うか、bunzip2コマンドを使用します。

書式:

bunzip2 ファイル名

<bunzip2コマンドの実行例>

$ bunzip2 hosts.new.bz2

xzコマンドによる圧縮(xz,unxz)

LZMA2アルゴリズムを使用圧縮方式で7zipの親戚です。bzip2よりも高い圧縮率をほこり、Linuxのカーネルソース等の巨大なファイルの圧縮に採用されています。圧縮率が高い分、処理時間がかかる上にCPU、メモリリソースを消費します。
xz圧縮するにはxzコマンドを使用します。xzコマンドで圧縮したファイルの拡張子は「.xz」になります。

書式:

xz [オプション] ファイル名
-l/--list圧縮ファイル内のファイル一覧を表示します。
-k/--keep圧縮元のファイルを残します。
-d/--decompress圧縮ファイルを展開します。

<xzコマンドの実行例>

$ xz touch_file
$ xz -k hosts.new

使用方法、挙動ともにgzip、bzip2とほぼ同じです。1行目を実行すると「hosts.new」がxz圧縮されて「hosts.new.xz」になります。これはgzipやbzip2コマンドと同じです。xzコマンドにはbzip2コマンドと同様に[-k]オプションがあります。これにより、2行目を実行すると元ファイルを残して圧縮ファイルを作成することができます。

xzコマンドも、gzip、bzip2コマンドと同様にディレクトリを圧縮することはできません。そのためディレクトリ構造を維持したまま圧縮したい場合は、tarコマンドを使用するしかありません。また、xzコマンドにも[-r]オプションもありません。

なお、xz形式のファイルを解凍する場合は、xzの「-d」オプションを使うか、unxzコマンドを使用します。

書式:

unxz ファイル名

<unxzコマンドの実行例>

$ ls to*
touch_file.xz
$ unxz touch_file.xz
$ ls to*
touch_file
PAGE TOP