分割ファイルの圧縮伸長

magic-rope
『まじっく快斗1412』
ご存じコナンのスピンオフですね。手品をする泥棒の話です。

私も遠い昔、興味を持ちましたが……、あ、泥棒の方ではなく、手品の話です。最初に覚えた手品がロープマジックでした。一本のロープをハサミで切って二本にしたら、その二本の端と端を結びます。そして、フーっと息を吹きかけると、結び目が飛んでいき、一本のロープに元通り。一度だけ上手くできたことがあります。子供の頃に悟ったのですが、この手品の難点は、ロープがハサミでなかなか切れないってところ。

split、cat、bzip2、unzip2で、この手品のようなファイル操作をしてみます。ロープマジックに見えなくてもご容赦ください。

まずは、(-)ハイフンでロープを作ります。

~$ perl -e 'print "-" x 60 . "\n"' > rope
~$ cat rope
------------------------------------------------------------
~$ 

遠くから見ればきっとロープです。

splitでロープを切ります。本当の手品では、元のロープをどこかに隠し持つのでしょうけど、コマンドラインではropeファイルは完全に消しておきましょう。

~$ split -db40 rope rope_
~$ ls
rope  rope_00  rope_01
~$ rm rope

2つのロープを確認します。タネも仕掛けもありません。

~$ head *
==> rope_00 <==
----------------------------------------
==> rope_01 <==
--------------------
~$ 

次はそれぞれのロープをbzip2圧縮して結んで……。

~$ bzip2 *
~$ ls
rope_00.bz2  rope_01.bz2
~$ cat * > tie.bz2
~$ rm rope*
~$ ls
tie.bz2
~$ 

そして、結び目に息を吹きかけます。

~$ bunzip2 tie.bz2
~$ cat tie
------------------------------------------------------------
:~/tmp$ 

ほら、元通り。

結合した圧縮ファイルは、伸長後に結合された状態になる仕様のためこうなるだけなのですが、手品と一緒でタネが分かる前は不思議でした。

数字を並べたファイルでも確認してみます。

~$ seq 50 | pr -t10
1      6      11     16	    21	   26	  31	 36	41     46
2      7      12     17	    22	   27	  32	 37	42     47
3      8      13     18	    23	   28	  33	 38	43     48
4      9      14     19	    24	   29	  34	 39	44     49
5      10     15     20	    25	   30	  35	 40	45     50
$ 

50までの連番を5個のファイルに分割して格納します。

~$ seq 50 | pr -t10 | split -dl1 - file_
~$ head *
==> file_00 <==
1      6      11     16	    21	   26	  31	 36	41     46

==> file_01 <==
2      7      12     17	    22	   27	  32	 37	42     47

==> file_02 <==
3      8      13     18	    23	   28	  33	 38	43     48

==> file_03 <==
4      9      14     19	    24	   29	  34	 39	44     49

==> file_04 <==
5      10     15     20	    25	   30	  35	 40	45     50
~$ 

それらを圧縮します。

~$ bzip2 *
~$ ls
file_00.bz2  file_01.bz2  file_02.bz2  file_03.bz2  file_04.bz2
~$ 

そして、結合したものを伸長。

~$ cat * > all.bz2
~$ rm file*
~$ ls
all.bz2
~$ 
~$ file all.bz2
all.bz2: bzip2 compressed data, block size = 900k
~$ 
~$ bunzip2 all.bz2
~$ ls
all
~$ cat all
1      6      11     16	    21	   26	  31	 36	41     46
2      7      12     17	    22	   27	  32	 37	42     47
3      8      13     18	    23	   28	  33	 38	43     48
4      9      14     19	    24	   29	  34	 39	44     49
5      10     15     20	    25	   30	  35	 40	45     50
~$ 

bzip2以外のアルゴリズムでも同様になります。

gzipの場合。

~$ seq 50 | pr -t10 | split -dl1 - file_
~$ gzip *
~$ ls
file_00.gz  file_01.gz  file_02.gz  file_03.gz  file_04.gz
~$ cat * > all.gz
~$ rm file*
~$ gunzip all.gz
~$ cat all
1      6      11     16	    21	   26	  31	 36	41     46
2      7      12     17	    22	   27	  32	 37	42     47
3      8      13     18	    23	   28	  33	 38	43     48
4      9      14     19	    24	   29	  34	 39	44     49
5      10     15     20	    25	   30	  35	 40	45     50
~$ 

xzの場合です。

~$ seq 50 | pr -t10 | split -dl1 - file_
~$ xz *
~$ ls
file_00.xz  file_01.xz  file_02.xz  file_03.xz  file_04.xz
~$ cat * > all.xz
~$ rm file*
~$ unxz all.xz
~$ cat all
1      6      11     16	    21	   26	  31	 36	41     46
2      7      12     17	    22	   27	  32	 37	42     47
3      8      13     18	    23	   28	  33	 38	43     48
4      9      14     19	    24	   29	  34	 39	44     49
5      10     15     20	    25	   30	  35	 40	45     50
~$ 

One response to “分割ファイルの圧縮伸長

  1. Now we know who the selisbne one is here. Great post!

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA