tarコマンドで圧縮と解凍

圧縮とかアーカイブとか紛らわしい言葉がいっぱいありまして、圧縮=アーカイブみたいなことに世間ではなっていますが、本来は全然違います。圧縮はアーカイブでもないし、アーカイブは圧縮ではありません。それはなぜかというと、アーカイブはバラバラのファイルを1つの書庫にまとめることをさしています。これは、もうただ単に1つにまとめることで、複数のバラバラのファイルを1つにして持ち運びしやすくするだけのものです。開発中のログ関連を1つにまとめておいて、後からデバックしやすくするとか。アーカイブされたものは後からバラバラにすることもできます。
圧縮は、その名の通り圧縮してファイルサイズを本当に小さくしてしまいます。これはアーカイブとは全然関係ありません。1つのファイルを対象にもできるし、複数のファイルを対象にすることもできます。圧縮されたものは、元のサイズに戻して使えるように解凍することができます。
この2つを一緒にしてしまうと結構わけがわからなくなります。私も若かりし頃は全くわかっていませんでした。
コマンドラインではこのアーカイブと圧縮をひとまとめにやってしまうことが非常に多いです。その時に使うのがいわゆるtarコマンドです。tarは元々、アーカイブだけを行うコマンドですが、オプション-zを指定すると圧縮も行なってくれます。勿論同様にアーカイブ展開と解凍も(オプション指定すると)やってくれます。

tarで圧縮するとき (.tar.gz形式でアーカイブ、圧縮する)

$ tar -cvzf <tarするファイル名>.tar.gz <tarの対象ファイル>
$ tar -cvzf ***.tar.gz file_01 file_02 dir_01 dir_02
($ tar -czf ***.tar.gz file_01 file_02 dir_01 dir_02)

複数のファイルやディレクトリをいっぺんに指定してアーカイブを圧縮を同時に行なってくれます。これが最も楽かと思います。
一応オプションの説明をしておくと、

-c, --create 新しいアーカイブを作成する。
-v, --verbose 処理されているファイルのリストを冗長に表示。
-z, gzipを通し、tar.gz形式のファイルを一度に圧縮・解凍する。
-f, --file=ARCHIVE 書庫ファイルまたはデバイスARCHIVEを使用。

ということになっています。
-vは処理中のファイルをダラダラーと表示させるコマンドです。あまりにもたくさんのファイルがある場合には省略しておいた方がいいかもです。2~3のファイルだったら実行後の確認のためにあった方が安心かもです。特に必要ない場合もあるので適宜省略しちゃってもいいです。
パーミッションがやたらと複雑なものはこのままtarするとパーミッションが保持できなくなっちゃうので、-pオプションを付けます。

$ tar -pcvzf <tarするファイル名>.tar.gz <tarの対象ファイル,またはディレクトリ>

tarで解凍するとき (.tar.gz形式のファイルを伸張、展開する)

$ tar -xvzf <解凍展開するファイル名>.tar.gz
$ tar -xvzf ***.tar.gz
($ tar -xzf ***.tar.gz)

解凍の際のオプションはというと、

-x, アーカイブからファイルを取り出す(展開する)
-v, --verbose 処理されているファイルのリストを冗長に表示。
-z, gzipを通し、tar.gz形式のファイルを一度に圧縮・解凍する。
-f, --file=ARCHIVE 書庫ファイルまたはデバイスARCHIVEを使用。

解凍する際の注意は、圧縮した際のファイル名がそのまま展開されてしまうことです。このせいで、例えばindex.htmlを圧縮した際にはわかりやすいようにindex.html.tar.gzみたいなわかりやすい名前がいいんです。このファイルを展開してしまうとindex.htmlにそのまま上書きされるのでご注意。圧縮した際のhtmlファイルに戻ってしまいます。別名で展開できればいいんですが、おそらくいろんなファイルを一緒くたんにアーカイブしているわけで…無理なんでしょうね。
いずれにしろ、ファイルとかディレクトリとかいっぺんに扱いたいときは、

アーカイブ・圧縮 tar -czf backup.tar.gz ./documents/
展開・解凍 tar -xzf backup.tar.gz

と覚えておけば当面使えます。

圧縮時にパーミッションを保持する

homeディレクトリ以下とかパーミッションを保持しながら圧縮したいときは、オプションの-pをつけます。cpコマンドとかと同じといえば同じです。(しかし、システム上「可能な限り」という文句がくっついていて、完全じゃないみたいです。私の経験ではパーミッションが崩れたことはないですが…)

$ tar -pcvzf <tarするファイル名>.tar.gz <tarの対象ファイル>
Last update: 2016.09.09 (金)