Archive::Tar でアーカイブを作成する
Archive::Tar で tar.gz を作ろうと思ってぐぐってみたら、
use Archive::Tar; my $tar = Archive::Tar->new; $tar->add_files( 'a.txt', 'b.txt' ); $tar->write("hoge.tar.gz", COMPRESS_GZIP);
みたいな感じの、ぶっちゃけ残念な感じのサンプルがヒットしまくる。
これの何が残念かというと、tar 使うとき
$ tar zcvf hoge.tar.gz a.txt b.txt
なんて打たないでしょ?
ふつー
$ tar zcvf hoge.tar.gz hoge/
って打つでしょ!
と、言うわけでもうちょい実用的そうなサンプル。File::Find と組み合わせればよい。つーかモジュールのドキュメントにそう書いといてほしい。
use Archive::Tar; use File::Find; use Cwd; use File::Spec::Functions qw(catfile); # tar zcf hoge.tar.gz hoge # と同じはず { my $dir = "hoge"; my $tar = Archive::Tar->new; my @files; find (sub { push @files, $File::Find::name }, $dir); $tar->add_files( @files ); $tar->write("hoge1.tar.gz", COMPRESS_GZIP); } # cd hoge; tar zcf ../hoge.tar.gz . ; cd .. # と同じはず。chdir が筋悪なので、もっと良い書き方があれば知りたいところ。 { my $cwd = getcwd(); my $dir = "hoge"; my $tar = Archive::Tar->new; chdir $dir; my @files; find (sub { push @files, $File::Find::name }, "."); $tar->add_files( @files ); $tar->write(catfile($cwd, "hoge2.tar.gz"), COMPRESS_GZIP); chdir $cwd; }
OS の tar を使わず、モジュールを使ってみたのは単なる気分だったりする。OS の tar とどっちがパフォーマンス良いかは今度測ってみようと思う。