KAEDE Hack blog

kaede0902 技術ブログ お仕事募集中。

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

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

参考

https://mondai.ping-t.com/question_subjects/56/question_sessions/2800714/progressing_questions/43039567/edit?no_selection=false

ping-t の回答

コマンド の比較

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 
gzip kaede$ 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 kaede$ gzip -c hoge.text > hoge.text.gz
gzip kaede$ 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

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

なので使うには複数のファイルが必要。

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 と何かを組み合わせろって言われる。

tar -cvf file.tar file.txt

基本的なコマンド

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

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 を使えばアーカイブの中身を見れる。


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 ファイルの圧縮前と圧縮後のサイズと、倍率などがわかる