使用perl在窗口中创建.tar或.gz文件

时间:2016-11-28 10:00:21

标签: perl window tar gz

我会尝试制作.tar或.gz文件。但我有一些问题,如:

  1. 它采用完整的路径

    D:\test\jtax-issue11-16\title.xml
    D:\test\jtax-issue11-16\artwork
    D:\test\jtax-issue11-16\artwork\cover.png
    
  2. 注意:上面也是我的文件夹结构。

    但我的要求是:

    jtax-issue11-16\title.xml
    jtax-issue11-16\artwork
    jtax-issue11-16\artwork\cover.png
    

    这意味着仅使用当前文件夹名称创建.tar或.gz文件

    我的代码是:

    use strict;
    use warnings;
    use Archive::Tar;
    use File::Find;
    use File::Basename 'basename';
    use Cwd;
    
    my $current_path = getcwd;
    my @inventory = ();
    find (sub { push @inventory, $File::Find::name }, $current_path);
    my $tar = Archive::Tar->new();  
    $tar->add_files(@inventory);
    $tar->write('a.tar');
    

    如果我使用basename,则会产生错误。我不明白如何使用basename或如何使用当前文件夹名称创建.tar或.gz文件。

3 个答案:

答案 0 :(得分:1)

use File::Find::Rule qw( );

my $base_dir = '.';

my @files =
   map { s{^\Q$base_dir/}{}r }
   File::Find::Rule
   ->mindepth(1)
   ->in($base_dir);

use File::Find qw( find );

my $base_dir = '.';

my @files;
find(
   {
      wanted => sub { push @files, s{^\Q$base_dir/}{}r },
      no_chdir => 1,
   },
   $base_dir
);
shift(@files);

答案 1 :(得分:0)

如果您在致电$current_path时进入find(),则应将.传递给find()。这样,您在$File::Find::name中获得的所有路径都将相对于当前目录;

my $current_path = getcwd;
my @inventory = ();
find (sub { push @inventory, $File::Find::name }, '.');

这将为您提供如下路径:

.\jtax-issue11-16\title.xml
.\jtax-issue11-16\artwork
.\jtax-issue11-16\artwork\cover.png

但是如果您对s/^\.\\//重要,那么您可以使用.\从该路径的开头删除@inventory。最简单的地方可能是在您构建@inventory = map { s/^\.\\//; $_ } @inventory; 之后。

div

答案 2 :(得分:0)

我将在我的文件中添加 Dave Cross 代码并获取我的o / p。 代码如下: -

use strict;
use warnings;
use Archive::Tar;
use File::Find;
use File::Basename 'basename';
use 5.010;
use Cwd;

my $current_dir = getcwd;
my @tar_files;
my @inventory = ();
find (sub { push @inventory, $File::Find::name }, $current_dir);
my $tar = Archive::Tar->new();
@inventory = map { s/^$current_dir\///; $_ } @inventory;
foreach my $temp (@inventory)
    {
        # skip my file name which is conv.pl 
        #  and skip blank entry in tar, which is created by $current_dir
        if ($temp =~ m/conv\.pl/ || $temp =~ m/conv\.exe/ ||$temp =~/$current_dir/)
        {
        }
        else
        {
            push (@tar_files , $temp );
        }
    }
$tar->add_files(@tar_files);
$tar->write($file_name.".tar");