pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


gzip, bzip2, xz のいずれの圧縮形式でも、圧縮ファイルを複数繋いだファイルを正しく展開できるんだそうです。

思うところがあり、以下の2つを試してみたら、同じ結果になりました。

ls *.gz  | xargs zcat | md5sum
cat *.gz  | zcat | md5sum

なんじゃそりゃ、と思って man gzip したら、ちゃんと書いてますな。

       Multiple compressed files can be concatenated. In this case, gunzip will extract all members
       at once. For example:

             gzip -c file1  > foo.gz
             gzip -c file2 >> foo.gz

       Then

             gunzip -c foo

       is equivalent to

             cat file1 file2

bzip2, xz についても試してみたけど、同様の結果でした。


ということは、cat の代わりに pv を使えば、ある圧縮ファイル群に対する処理の進捗と終了予測が分かる訳ですね。うーむ素晴らしい。

連結できるころを知らないと、例えば以下のように実行してしまうわけですが、これだと進捗は分かっても終了予測が分からない。

ls *.gz  | xargs zcat | pv | [何かの処理...]


だけど連結してもOKなら以下のように実行できるわけで、これなら終了予測が分かるので非常にありがたい。

pv *.gz  | zcat | [何かの処理...]


考えてみれば tar だって -A で tar ファイル同士を連結できるわけで、そういう意味では UNIX のコマンドは、よくできているのですね。


ふと思い出したのですが、むかーしむかし、MS-DOS な時代に CD-ROM 1枚分に相当するデータを圧縮せねばならない案件がありまして、LHa で実際にやってみるとデータ量が多すぎてメモリが足らんという残念な状況に遭遇した記憶があります。そのときは以下のような方法で問題を回避しましたが、このときに UNIX 系のコマンドで実装していたら、あまり苦労せずに済んだのでしょうか。。。

  • LHa のファイルフォーマットをハックしたうえで、1ファイルづつを圧縮しては sppend する処理を実装。
  • LHa の圧縮処理が一時ファイルに書き出されることによる処理速度の遅さは、smartdrv.sys によるI/Oキャッシュで改善。