Perl Archive :: Tar如何排除根目录

时间:2017-11-22 07:45:42

标签: perl

我需要在.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 );

    }

1 个答案:

答案 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);