Skip to content

Instantly share code, notes, and snippets.

@tos-kamiya
Last active November 19, 2018 10:36
Show Gist options
  • Save tos-kamiya/e872f5a46c066d12bfa8e2a49d6cdd7a to your computer and use it in GitHub Desktop.
Save tos-kamiya/e872f5a46c066d12bfa8e2a49d6cdd7a to your computer and use it in GitHub Desktop.
gzipの仕様は間違いなくプロの仕事

結論: gzip(map(zcat, f...)) = cat(f...) として扱える仕様

複数のファイルをcatししたものをgzipで固められる。当たり前

$ echo a > a.txt
$ echo b > b.txt
$ echo c > c.txt
$ cat a.txt b.txt c.txt
a
b
c
$ cat a.txt b.txt c.txt | gzip > abc.txt.gz
$ zcat abc.txt.gz 
a
b
c

zcatを使えば展開できるから、すでに固められた複数のファイルを展開して連結してgzipで固めることができる。当たり前

$ gzip a.txt
$ gzip b.txt
$ gzip c.txt
$ ls -1
a.txt.gz
abc.txt.gz
b.txt.gz
c.txt.gz
$ zcat a.txt.gz b.txt.gz c.txt.gz | gzip > abc.txt.gz
$ zcat abc.txt.gz
a
b
c

すでに固められたファイルを(zcatではなくてバイト単位の)catでつなげても正しいgzipファイルが得られるという仕様。すごい

$ rm abc.txt.gz 
$ cat a.txt.gz b.txt.gz c.txt.gz > abc.txt.gz
$ zcat abc.txt.gz
a
b
c

ちょっとまて。中味が空のファイルもgzipでは大きさあったよね???

$ touch empty.txt
$ gzip empty.txt
$ ls -l
合計 20
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 a.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 84  9月 26 03:06 abc.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 b.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 c.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 30  9月 26 03:06 empty.txt.gz

lsの結果の最後の行。空のファイルをgzipで固めたファイルは30バイトある。

んじゃ、この30バイトのファイルをcatで3回つなげたファイルを作ると・・・

$ cat empty.txt.gz empty.txt.gz empty.txt.gz > empty3times.txt.gz
$ ls -l
合計 24
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 a.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 84  9月 26 03:06 abc.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 b.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 28  9月 26 03:04 c.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 30  9月 26 03:06 empty.txt.gz
-rw-rw-r-- 1 toshihiro toshihiro 90  9月 26 03:07 empty3times.txt.gz

・・・予想通り、90バイトのファイルができた。その中味は?・・・

$ zcat empty3times.txt.gz
$

・・・やっぱり空だった。シェルの作業を楽にするためのすごく練られた仕様。びっくりした

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment