我需要在.tgz
目录中提取d:\work
文件(包含目录树/文件),进行一些更改并重新打包。
解压缩的文件夹与D:\work\123a\...
类似(因此.tgz
包含文件夹123a
和许多子文件夹\文件。
现在我尝试使用Archive::Tar
并递归打包,但问题是" work"文件夹也被压缩。 - 所以它将是\work\123a\...
如何排除这个"工作"文件夹(cwd或root目录)。
任何帮助表示赞赏。
我的代码:
my $tar = Archive::Tar->new;
$tar->read("$tgzfiles[0]");
$tar->extract();
(my $tgzfolder = $tgzfiles[0]) =~ s/\.[^.]+$//;
# Here I make some changes in content{.....}
our $arc = Archive::Tar->new();
find( \&archiveit, "d:/work/$tgzfolder" );
$arc->write("$tgzfiles[0]", 9);
sub archiveit {
$arc->add_files( $File::Find::name );
}
答案 0 :(得分:1)
以下适用于我。最初的test.tgz
位于主文件夹中。
我使用chdir切换到工作目录,但后来我需要为no_chdir
函数提供wanted
选项,以防止将目录更改为子目录。
另外,我猜$ tgz文件夹应该是提取文件的路径,因此应该从存档内容中提取,而不是从其名称中提取。
#!/usr/bin/perl
use warnings;
use strict;
use Archive::Tar;
use File::Find;
my @tgzfiles = "$ENV{HOME}/test.tgz";
chdir 'd:/work';
my $tar = 'Archive::Tar'->new;
$tar->read($tgzfiles[0]);
$tar->extract;
# Modify the contents.
my $tgzfolder = ($tar->list_files)[0];
my $arc = 'Archive::Tar'->new;
find({wanted => sub { $arc->add_files($File::Find::name) },
no_chdir => 1},
$tgzfolder );
$arc->write($tgzfiles[0], 9);