ファイルシステムと書庫

INPUT · スライド

縮める(`gzip`)

01 / 06

同じ中身を、短く書く

前の回で tar は縮めないと分かったね。縮める役はこの人だよ。

~ $ gzip moto.txt

仕組みはとても素直だよ。繰り返しを見つけて、短い印に置きかえるんだ。

hello hello hello hello ...(2000回)「hello を 2000 回」と書く

実際に測ると、12000 バイトが 61 バイトになるよ。200分の1だね。

もちろん、こんなに縮むのは繰り返しが多いときだけだよ。

同じ言葉が並ぶ文章・ログ   → よく縮む写真や動画・すでに圧縮済み → ほとんど縮まない

写真(JPEG)や動画はすでに圧縮されているので、gzip をかけても逆に少し増えるんだ。増える理由は、印の表を一緒に入れないと元に戻せないからだよ。

だから圧縮は「魔法」ではないんだ。中身の性質次第だよ。

02 / 06

元のファイルが消える

ここが gzip のいちばん驚くところだよ。

~ $ lsmoto.txt~ $ gzip moto.txt~ $ lsmoto.txt.gz        ← moto.txt が無くなっている!

元のファイルを置きかえるんだ。cp のように写しを作るのではないよ。

戻すのは gunzip だよ。

~ $ gunzip moto.txt.gz~ $ lsmoto.txt           ← 戻った(.gz は消える)

どちらも「置きかえ」なので、行ったり来たりするだけだね。

元を残したいときは -kkeep)を足すよ。

~ $ gzip -k moto.txt~ $ lsmoto.txt   moto.txt.gz     ← 両方ある

書き方は3つ覚えれば十分だよ。

打つものすること
gzip 名前縮める(元は消える)
gunzip 名前.gz戻す
gzip -d 名前.gz戻す(gunzip と同じ)

gunzipgzip -dまったく同じものだよ。同じプログラムが2つの名前で呼ばれているんだ。前の回でやった、busybox に名前がたくさん付いている話と同じだね。

03 / 06

開かずに読む zcat

縮めたファイルを読むのに、いちいち戻すのは面倒でしょう。そのための道具があるよ。

~ $ zcat access.log.gzok /index.htmlerror /missing.html...

cat の親戚だね。縮めたまま中身を出すんだ。ファイルは .gz のままだよ。

出口に出ているので、当然パイプにつながるよ。

~ $ zcat access.log.gz | grep error | wc -l3

これが実務でいちばん使う形だよ。サーバーの古いログは、ほぼ必ず縮めて置いてあるんだ。

/var/log/messages         今のログ/var/log/messages.1.gz    昨日のぶん(縮めてある)/var/log/messages.2.gz    その前

だから調べものはこうなるよ。

zcat /var/log/messages.*.gz | grep error

-c を使えば、gzip 自身も出口に出せるよ。

gzip -c moto.txt > kopi.gz     元を残したまま、別の名前で縮める

-c はいろいろなコマンドで「ファイルではなく出口へ」という意味で使われるよ。覚えておくと役に立つね。

04 / 06

.tar.gz の正体

よく見かけるこの名前、もう読めるようになったはずだよ。

shiryo.tar.gz       ↑   ↑       │   └─ gzip で縮めた       └───── tar で固めた

2つの道具を、順に通したという履歴が名前に書いてあるんだ。だから作るのも2手だよ。

~ $ tar cf shiryo.tar shiryo    固める~ $ gzip shiryo.tar             縮める~ $ lsshiryo.tar.gz

戻すときは逆の順だね。

~ $ gunzip shiryo.tar.gz        ほどく~ $ tar xf shiryo.tar           開ける

順番が逆になるのは、着るときと脱ぐときの順が逆なのと同じだよ。

1手でやりたいときはパイプでつなぐんだ。

~ $ gunzip -c shiryo.tar.gz | tar tf -

最後の - は「ファイルではなく入口から受け取る」という印だよ。章4で xargs を覚えたときに似た話が出たね。

なお、この環境の tarz の印を持っていないので、こうやって分けるしかないんだ。本物の Linux ではこれ一発で済むよ。

tar czf shiryo.tar.gz shiryo    作るtar tzf shiryo.tar.gz           見るtar xzf shiryo.tar.gz           取り出す

05 / 06

壊れていないか確かめる

縮めたファイルには、こういう心配があるよ。

途中で通信が切れたコピーが途中で止まった

中を見ようとするまで気づけないので、確かめる印が用意されているよ。

~ $ gzip -t shiryo.tar.gz~ $ echo $?0                    ← 大丈夫

壊れているとこうなるよ。

~ $ gzip -t uso.gzgzip: invalid magic~ $ echo $?1                    ← だめ

-ttest の t だよ。何も言わずに終わったら無事、というのがコマンドラインの作法だね。章4でやった「静かなのは成功」だよ。

invalid magicmagic は、ファイルの先頭に入っている「私は gzip です」という目印のことだよ。

先頭の数バイトを見れば、種類が分かる

章2で file コマンドが中身から種類を当てていたのは、この目印を読んでいたんだ。拡張子は人のための飾りで、本当の種類は中に書いてあるんだよ。

だから .gz に名前を変えただけのテキストは、gzip -t にすぐ見破られるんだね。

06 / 06

さあ、打ってみよう

この回で使う形をまとめておくね。

gzip 名前               縮める(元は消える)gzip -k 名前            縮める(元も残す)gzip -c 名前 > 別名.gz  出口に出して別名で保存gunzip 名前.gz          戻すgzip -d 名前.gz         戻す(同じこと)zcat 名前.gz            縮めたまま中身を出すgzip -t 名前.gz         壊れていないか調べる

練習用に大きめのファイルを作る手も使うよ。

~ $ yes hello | head -2000 > moto.txt

yes は同じ言葉をいくらでも出し続けるコマンドだよ。章8で「重い仕事」の代わりに使ったのを覚えているかな。それを head -2000 で 2000 行だけ切り取っているんだ。

繰り返しばかりなので、これはよく縮む材料だよ。逆に縮まない材料も作れるよ。

~ $ head -c 12000 /dev/urandom > ran.bin

/dev/urandomでたらめな値を出す装置で、/dev/zero の兄弟だよ。繰り返しが無いので縮まないんだ。両方を測って、違いを自分の目で見てみよう。