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キャッシュで改善。