oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

複数ファイルが固められた圧縮ファイル(tar.gz、zipとか)を

[メモ]複数ファイルが固められた圧縮ファイル(tar.gz、zipとか)を標準出力する方法


いつも忘れるのでメモ。
例えば、1.txt、2.txt、3.txtみたいなテキストファイルがあり、それをtarかzipでそのまま固められている時、
いちいち伸長して読み込んで・・・みたいなのはムダが多すぎ。
圧縮時で数GBとかある容量が大きいログを読み込みたい時とか特にやりたくないですよね。


でも、例えば

# zip t.zip ./1.txt ./2.txt ./3.txt
# unzip -l t.zip
Archive:  t.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
       49  01-17-12 12:43   1.txt
       49  01-17-12 12:43   2.txt
       49  01-17-12 12:43   3.txt
 --------                   -------
      147                   3 files

みたいなので圧縮したファイルを、そのままzcatで読もうとすると、

# zcat t.zip
hogehoge
zcat: t.zip has more than one entry--rest ignored

みたいな感じで複数のファイルがあるのに、初めのファイルだけで止まってしまう。


また、tarコマンドの場合は

# tar czvf tar.gz ./1.txt ./2.txt ./3.txt

こんな感じで固めていると、

# zcat tar.gz
./1.txt0000644000000000000000000000001111705172702010604 0ustar  rootroothogehoge
./2.txt0000644000000000000000000000001111705172717010613 0ustar  rootrootfugafuga
./3.txt0000644000000000000000000000001111705172742010612 0ustar  rootroothogefuga

こんなので、余計なのが色々。


で、純粋にファイルの中身だけで標準出力したい場合は、
zipの場合、

# unzip -p ./t.zip
hogehoge
fugafuga
hogefuga

tarの場合、

# tar -Ozxf ./tar.gz
hogehoge
fugafuga
hogefuga

で、ファイルの中身だけ標準出力出来る。


元のファイル構成を維持する必要が無ければ、圧縮時に一度一つのファイルに書いてから圧縮すると、
上記の事考える必要も無いし、圧縮率も良いみたいです(gzipコマンドのmanより)
こんな感じで。

cat file1 file2 | gzip > foo.gz


圧縮一つ取っても、結果は同じような形になると思いきや、実は大分違うので、
些細な捨てスクリプトでも、「気が効いているね!」って言われるようなスクリプトを書きたい物ですね!