Linuxの圧縮/解凍コマンド

Linuxの圧縮/解凍コマンドは拡張子によってい色々と分かれていて解りづらい。
基本"tar"を使用するのだろうが、"tar"では解凍できないものもあるので、
今更ではあるが、Linuxの圧縮/解凍を簡単にまとめてみた。


tarコマンド


Linuxではほぼこのコマンドを使うのではないか。
"tar"は古くからあるコマンドで、オプションに"-(ハイフン)"を付けなくても動く。

ハイフンを付けても付けなくてもどちらでも良いのだろうが、
基本的にLinuxのオプションはハイフンを付けて実行するので、
これから覚えるのであればハイフンありで覚えたほうが無難だろう。

一点注意点があり、ファイル名を指定する"-f"オプションは必ず最後にした方が良い。
"-f"を最後にしないとうまくファイル名を認識してくれないことがあるからだ。

基本的な使い方は下記のようになるが、tarコマンドの特徴としては、
圧縮も解凍もでき、ファイルもディレクトリもやり方が一緒なことである。


■".tar"アーカイブの作成
アーカイブとはファイルをまとめる行為を言う。
圧縮とは少々意味合いが異なるのだが、一旦置いておく。
tarコマンドは基本的にアーカイブするコマンドなのである。

□単体ファイルの場合
 $ tar -cf aaa.tar aaa


□複数ファイルの場合
 $ tar -cf file.tar aaa bbb ccc


□ディレクトリの場合
 $ tar -cf dir.tar archive/


ちなみに"-v"オプションを付ければ、ファイルの一覧も同時に確認できる。
しかし、アーカイブファイルの中身が大量にある場合は付けない方が良いかと。

 $ tar -cvf dir.tar archive/
archive/
archive/aaa
archive/bbb
archive/ccc



■".tar"アーカイブの展開
基本的にオプションが違うだけで、ほぼ作成時と一緒なので詳細は割愛。
ファイル名はアーカイブファイル名のみ指定すれば良い。

 $ tar -xf aaa.tar



■".tar.gz"で圧縮
tarコマンドは基本的にアーカイブするだけなので、
圧縮もしたければオプション"-z"を追加する必要がある。
アーカイブファイルの拡張子を".tar"ではなく".tar.gz"にする必要もある。

 $ tar -zcvf dir.tar.gz archive/
archive/
archive/aaa
archive/bbb
archive/ccc



■".tar.gz"を解凍
解凍もオプション"-z"を追加することには変わりはない。

 $ tar -zxvf dir.tar.gz
archive/
archive/aaa
archive/bbb
archive/ccc


ちなみに".tar.bz2"に圧縮したり解凍したりしたい場合は、
オプションの"-z"を"-j"に変更してあげれば良い。

 $ tar -jcvf dir.tar.bz2 archive/
$ tar -jxvf dir.tar.bz2


いつからなのかは知らないが、解凍だけであれば"-xf"だけでも自動判別してくれるようだ。

 $ tar -xf dir.tar.gz



■アーカイブファイルの中身を確認
オプション"-t"を使用することにより、展開せずに中身を確認できる。
".tar"でも".tar.gz"でもやり方は一緒。

 $ tar -tf dir.tar.gz
archive/
archive/aaa
archive/bbb
archive/ccc


出力結果には違いは見られないが、実際はアーカイブファイルを展開していないので、
中身を確認したいだけなのであれば、余計なファイルができなくて良い。


zipの圧縮/解凍


■zipファイルへの圧縮
zipファイルへ圧縮するにはzipコマンドを使用する。
複数ファイルを指定する場合はtarと一緒で、スペース区切りで続ければ良い。

 $ zip file.zip aaa
adding: aaa (stored 0%)


圧縮率が0%なのは、テスト用に0バイトの空ファイルを使用しているから。

圧縮時に既存のzipファイル名を指定した場合は、
対象ファイルと同じファイル名があれば更新、違うファイル名であれば追加してくれる。
このあたりは意外と優秀。

 $ zip file.zip aaa bbb ccc
updating: aaa (stored 0%)
adding: bbb (stored 0%)
adding: ccc (stored 0%)


ディレクトリごと圧縮するにはオプション"-r"を付ける。
オプションなしでディレクトリを指定すると空ディレクトリを圧縮する形になるので注意。

 $ zip -r dir.zip archive/
adding: archive/ (stored 0%)
adding: archive/aaa (stored 0%)
adding: archive/bbb (stored 0%)
adding: archive/ccc (stored 0%)
adding: archive/dir.tar.gz (stored 0%)


ちなみにzipは解凍時のパスワードを指定できるのが特徴。
セキュリティ的にも強化されるので、メールの添付ファイルはzipが多い。

 $ zip -e file.zip aaa
Enter password:
Verify password:



■zipファイルの解凍
zipファイルを解凍するにはunzipコマンドを使用する。
圧縮/解凍でコマンドが異なる点が鬱陶しいが、
解凍ファイル名が既に存在した場合は、対話式に問合せてくれるので意外と優秀。

 $ unzip file.zip
Archive: file.zip
replace aaa? [y]es, [n]o, [A]ll, [N]one, [r]ename: r
new name: aaaa
extracting: aaaa


ちなみに圧縮ファイルの中身だけ見たい場合は下記のように"-l"を付ければ良い。

 $ unzip -l file.zip
Archive: file.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-08-26 15:53 aaa
--------- -------
0 1 file


まぁWindowsとやり取りとかしなければ無理にzipにしなくても良いと思う。
Linux内だけであれば".tar.gz"がやはり主流かなと。


gzipの圧縮/解凍


昔はtarでアーカイブしたファイルをgzipで".tar.gz"に圧縮するとか
やっていたのだろうが、今はほとんどやらないだろう。
一応使い方だけ記載しておく。

■gzipファイルへの圧縮
少々今までのコマンドとは毛色が異なる。
ファイルを圧縮すると元のファイルは消えてしまうのだ。

 $ ls
aaa bbb ccc
$ gzip aaa
$ ls
aaa.gz bbb ccc


複数ファイルを指定したときも挙動が異なる。

 $ gzip bbb ccc
$ ls
aaa.gz bbb.gz ccc.gz


ディレクトリの圧縮もちょいと微妙で、
中身のファイルだけ個々に圧縮される形になる。

 $ ls test/
aaa bbb ccc
$ gzip -r test
$ ls test/
aaa.gz bbb.gz ccc.gz


これならtarを駆使した方が使い勝手が良いと思う。


■gzipファイルの解凍
gzipの解凍にはオプションで対応するか、
zipのように解凍コマンドを使うかのどちらかになる。
挙動は言うまでもないが、解凍後に圧縮ファイルが通常のファイルに置き換えられる。

□gzipコマンドのオプション"-d"での解凍
 $ ls
aaa.gz bbb.gz ccc.gz
$ gzip -d aaa.gz
$ ls
aaa bbb.gz ccc.gz


□gunzipコマンドでの解凍
 $ ls
aaa bbb.gz ccc.gz
$ gunzip bbb.gz
$ ls
aaa bbb ccc.gz



bzip2の圧縮/解凍


圧縮率はgzipよりも高いが、その分時間がかかるので、一般的なのはgzip圧縮である。
バックアップ時にはbzip2圧縮が一般的らしい。

使い方はgzipとほぼ一緒でコマンドが違うだけである。
挙動も一緒で圧縮すると元ファイルが消え、展開すると圧縮ファイルが消える。

■bzip2ファイルへの圧縮
 $ ls
aaa bbb ccc
$ bzip2 aaa
$ ls
aaa.bz2 bbb ccc



■bzip2ファイルの解凍
解凍に関してもgzipと一緒で、オプションか解凍コマンドでの実行が可能。

□bzip2コマンドのオプション"-d"での解凍
 $ ls
aaa.bz2 bbb ccc
$ bzip2 -d aaa.bz2
$ ls
aaa bbb ccc


□bunzip2コマンドでの解凍
 $ ls
aaa.bz2 bbb ccc
$ bunzip2 aaa.bz2
$ ls
aaa bbb ccc



こんな感じで圧縮/解凍だけでも色々とある。
とりあえず普通に圧縮/解凍するだけならtarコマンドがあれば十分な気がする。
その他、"zipをどうしても使いたい"とか"オプションで細かい指定をしたい"などあれば
個別にコマンドを使っていけば良いと思う。そのへんは臨機応変に。


以上。




この記事へのコメント