【问题标题】:Perl tar file creates directory recursivelyPerl tar 文件递归创建目录
【发布时间】:2020-05-30 03:36:37
【问题描述】:

我正在使用Archive::Tar 模块对目录内容进行去皮。

我的脚本如下:

#!/usr/bin/perl -w 

use strict;
use warnings;
use Archive::Tar;
use File::Find;
use Data::Dumper;

my $home_dir = "C:/Users/Documents/Vinod/Perl_Scripts/test/";

my $src_location = $home_dir."LOG_DIR";
my $dst_location = $home_dir."file.tar.gz";

my @inventory = ();
find (sub { push @inventory, $File::Find::name }, $src_location);

print "Files:".Dumper(\@inventory);

my $tar = Archive::Tar->new();

$tar->add_files( @inventory );

$tar->write( $dst_location , 9 );

脚本能够在位置C:/Users/Documents/Vinod/Perl_Scripts/test/ 中创建file.tar.gz 文件。

但是当我手动提取file.tar.gz 时,它会再次递归地创建一个完整的路径。所以LOG_DIR的内容将在C:/Users/Documents/Vinod/Perl_Scripts/test/file.tar/file/Users/Documents/Vinod/Perl_Scripts/test/LOG_DIR/位置可见

如何在提取时将C:/Users/Documents/Vinod/Perl_Scripts/test/LOG_DIR/ 中的内容放在C:/Users/Documents/Vinod/Perl_Scripts/test/file.tar/file/ 中。

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果你不想重新创建完整路径,chdir 进入主目录,并使源目录相对:

    my $home_dir = "C:/Users/Documents/Vinod/Perl_Scripts/test/";
    
    chdir $home_dir;
    my $src_location = "LOG_DIR";
    my $dst_location = $home_dir."file.tar.gz";
    

    【讨论】:

      【解决方案2】:

      由于您使用$File::Find::name 作为列表,您将获得每个文件的绝对路径。这是您给Archive::Tar 的名称,所以这就是它使用的名称。您可以在 tarball 中查看文件:

      $ tar -tzf archive.tgz
      

      有多种方法可以获取相对路径。您可以在想要的功能中执行此操作。删除您不想要的路径部分。这通常不会是您用于 find (src_location) 的目录,因为您希望保持该级别的结构:

      my @inventory;
      find(
          sub {
              return if /\A\.\.?\z/;
              push @inventory, abs2rel( $File::Find::name, $home_dir )
              }, $src_location
          );
      

      或者之后做:

      @inventory = map { abs2rel($_, $home_dir) } @inventory;
      

      【讨论】: