複数ファイルが固められた圧縮ファイル(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
圧縮一つ取っても、結果は同じような形になると思いきや、実は大分違うので、
些細な捨てスクリプトでも、「気が効いているね!」って言われるようなスクリプトを書きたい物ですね!