KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

Linuc 101 Linux コマンド -- gzip, tar, xz, -- ファイルのアーカイブと圧縮 

why

Linuc 101 の学習中、

ファイル圧縮をするコマンドが多く、オプションも混じりやすいくなったので整理する

gzip, tar, xz, をまとめた

圧縮コマンド の比較

qiita.com

Qiita の圧縮コマンド一覧

gzip が一般的で、bzip がより強力で、xz はもっと強力だが、圧縮後のサイズが大き聞くなるパターンがある(これは小さいテキストファイルを圧縮する時にでくわした)zip は win でしか使われないらしい。win では 7zip が圧縮率高くて強度の高い暗号が作れていいらしい

gzip

gzip 方式で圧縮するコマンド

引数なしの場合

www.koikikukan.com

ls
hoge.text
gzip hoge.text 
ls
hoge.text.gz

ファイル名に.gz がついたファイルが残る

引数なしでは圧縮前のファイルは残らない。

cat hoge.text.gz 
`hoge.textKI-I(JpE

圧縮されたファイルは cat では出力できない。

vi ではなぜか開ける...

圧縮前後のファイルサイズの比較

ll
total 8
-rw-r--r--  1 kaede  staff  270 Apr 28 10:16 hoge.text
ll
total 8
-rw-r--r--  1 kaede  staff  44 Apr 28 10:16 hoge.text.gz

gzip にした後のファイルサイズを見てみると、 270 bite -> 44 bite で 1/6 ほどの削減されている。

gzip -d -- 圧縮したファイルを展開、解凍

ls
hoge.text.gz
gzip -d hoge.text.gz 
ll
total 8
-rw-r--r--  1 kaede  staff  270 Apr 28 10:16 hoge.text

-d コマンドで、作成した .gz の圧縮ずみファイルを展開できる。

gzip -c file > file.gz -- 元のファイルも残して圧縮

gzip -c だけでは使えない。

標準出力の出力先をファイルに指定する > を使う必要があるらしい。

ls
hoge.text
gzip -c hoge.text > hoge.text.gz
ls
hoge.text       hoge.text.gz

出力先の指定が必要だが、これで元のファイルも残して圧縮できる。

gzip -r -- 再帰的に圧縮する

ディレクトリもまとめて圧縮できるってことだろうか?

階層を作ってみる

tree
.
└── dirA
    └── dirB
        └── dirC
            └── innerDirc.txt

3 directories, 1 file

3つの階層の下にテキストファイルを置く

gzip dirA/
gzip: dirA/ is a directory

引数なしではディレクトリには gzip できないが

gzip -r dirA/
gzip kaede$ ll dirA/dirB/dirC/
total 8
-rw-r--r--  1 kaede  staff  47 Apr 28 10:45 innerDirc.txt.gz

-r のオプションをつけるとフォルダの中のフォルダの中のファイルを圧縮できる。

gzip -v

圧縮率を見せながら圧縮できるらしい

tar

Unix で一番メジャーな圧縮コマンド? gzip より難しい。

アーカイブをする。

eng-entrance.com

アーカイブとは複数のファイルを一つのファイルにまとめること。

しかし、一つのファイルでもアーカイブは作れる。 gmailアーカイブもこういうコマンドを内部で走らせているのだろうか?

ps コマンドのようにアルファベットを3つほど組み合わせる引数指定。

また、まとめたアーカイブの中を

  • 展開せずに見たり
  • さらに追加したり
  • 中身の一部を削除したり

といった操作が可能なので、zip とはかなり違う。

引数なし

tar hoge.txt 
Usage:
  List:    tar -tf <archive-filename>
  Extract: tar -xf <archive-filename>
  Create:  tar -cf <archive-filename> [filenames...]
  Help:    tar --help

引数なしでは使えない。

ファイル指定の f と、

アーカイブの中身をリスト表示する t

アーカイブを展開する x

アーカイブを作成する c

のどれかを使わなければいけない。


アーカイブ作成 -- tar -cvf file.tar file.txt

まず、アーカイブを作成する create の c

tar -cvf hoge.tar hoge.txt 
a hoge.txt
ls
hoge.tar        hoge.txt

gz と違って圧縮前のテキストファイルは削除されない。

gz と違って.txt.gz と拡張子を重ねる形にはならない。というかファイル名を指定する

-cvf 作成するアーカイブ、作成元のファイル、と言う順番なので注意。

tar -cvf arc.tar hoge.txt hoge2.txt 
a hoge.txt
a hoge2.txt
ls
arc.tar         hoge.tar        hoge.txt        hoge2.txt

複数のファイルからアーカイブを作ることもできる。

正規表現* を使えばフォルダないもまとめてアーカイブに放り込める。


tar -tf -- アーカイブの中身を表示

tar -tf arc.tar 
hoge.txt
hoge2.txt

-tf を使えばアーカイブの中身を表示できる。

展開はされないので、元のファイルもなくならないし、展開されたファイルもでてこない。


tar -xf -- アーカイブの中身を展開

extract の x

expand ではなかった

tar -xf arc.tar 

-xf を使えばアーカイブの中身を展開できる



xz

xz 方式でファイルを圧縮、展開できる

引数なし

ll
total 8
-rw-r--r--  1 kaede  staff  13 Apr 29 12:07 hoge.txt

xz hoge.txt 
RYOs-MBP:xz kaede$ ll
total 8
-rw-r--r--  1 kaede  staff  72 Apr 29 12:07 hoge.txt.xz

なぜかファイルサイズが増える

xz -d file.xz -- 解凍

xz -d hoge.txt.xz
ls
hoge.txt

普通の解凍コマンド

xz -k file -- 元のファイルを残して圧縮

xz -k hoge.txt 
ls
hoge.txt        hoge.txt.xz

xz fileA fileB -- 複数のファイルを個別に圧縮する

ls
textA   textB
xz textA textB
ls
textA.xz    textB.xz

複数ファイルを指定すると、 gzip のように一つに纏まるわけではなく、個別に圧縮される。

一つのファイルに圧縮する方法は未検索

xz - l -- 圧縮先の xz ファイルの中身を見る

xz -l textA.xz 
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1         72 B         15 B  4.800  CRC64   textA.xz

xz ファイルの圧縮前と圧縮後のサイズと、倍率などがわかる