tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

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 とどっちがパフォーマンス良いかは今度測ってみようと思う。