Archive::Tar - tarファイルの作成と展開
Archive::Tarを使用すると、tarファイルを展開あるいは作成することができます。
# モジュールの読み込みとオブジェクトの作成 use Archive::Tar; my $tar = Archive::Tar->new;
メモリ上にtarファイルの情報を読み込むにはreadメソッドを使用します。ファイルを展開するにはtarファイルを読み込んだ後に、extractメソッドを使用します。ファイルはカレントディレクトリに展開されます。
# tarファイルの展開
$tar->read('archive.tar');
$tar->extract;
tarファイルがgzip形式で圧縮されている場合も展開することができます。ファイルがgzip形式で圧縮されているかどうかは自動的に判定されます。
# gzip形式で圧縮されているtarファイルの展開
$tar->read('archive.tar.gz');
$tar->extract;
tarファイルを作成するには、add_filesメソッドでファイルを追加してから、writeメソッドでtarファイルに書き込みます。ファイル名はカレントディレクトリを変更してから、相対パスでadd_filesで追加します。
# tarファイルの作成
my $curdir = '/somedir';
chdir $curdir
or die qq/Can't change directory "$curdir": $!/;
$tar->add_files('xxx.txt', 'dir/yyy.txt');
$tar->write('archive.tar');
またgzip形式で圧縮されたtarファイルを作成することもできます。gzip形式に圧縮する場合は、第二引数に圧縮率を示す2~9の値を指定します。大きな数を指定するほど圧縮率が高くなります。
# tar.gzファイルの作成
$tar->write('archive.tar.gz', 9);
Archive::Tarのその他のテクニック
extractの引数にファイル名を指定すれば指定したファイルだけを展開することができます。
# 指定したファイルのみを展開
$tar->extract('xxx.txt', 'dir/yyy.txt');
tarファイルに含まれているファイルを調べるにはlist_filesメソッドを使用します。
# tarファイルに含まれているファイル一覧を取得 my @files = $tar->list_files;
tarファイルから指定したファイルを取り除くにはremoveメソッドを使用します。
# tarファイルから指定したファイルを取り除く
$tar->remove('xxx.txt');
tarファイルに含まれるファイル名を変更するにはrenameメソッドを使用します。
# tarファイルに含まれるファイル名を変更する
$tar->rename('from.txt', 'to.txt');
clearメソッドを使用するとメモリ上のtarファイルの情報をクリアすることができます。
# メモリ上のtarファイルの情報をクリア $tar->clear;
Archive::Tarに関するFAQ
Q. ディレクトリを指定して、そこに含まれるすべてのファイルをtarファイルにすることはできますか。
A. そのようなメソッドは存在しないので、工夫する必要があります。再帰的にすべてのファイルを検索することができるFile::Findモジュールを利用します。topという名前のディレクトリ以下に含まれるすべてのファイル(topディレクトリ自体も含みます)からtarファイルを作成するサンプルです。
# ディレクトリを指定してそれ以下のすべてのファイルからtarファイルを作成
use File::Find 'find';
use Archive::Tar;
my $curdir = '/somedir';
chdir $curdir
or die qq/Can't change directory "$curdir": $!/;
my $tar = Archive::Tar->new;
my $top = 'top';
my @files;
find(sub {
push @files, $File::Find::name;
}, $top);
$tar->add_files(@files);
$tar->write("$top.tar");
Q. シンボリックリンク先のファイルをtarファイルに含めることはできますか
A. はい。パッケージ変数 $Archive::Tar::FOLLOW_SYMLINK に 1 を設定します。
# シンボリックリンク先のファイルをtarファイルに含める
local $Archive::Tar::FOLLOW_SYMLINK = 1;
$tar->write('archive.tar');
Perlゼミ

