使用perl在窗口中制作.tar或.gz文件



我将尝试制作.tar或.gz文件。但是我有一些问题:

  1. 它采用完整的路径

    D:testjtax-issue11-16title.xml
    D:testjtax-issue11-16artwork
    D:testjtax-issue11-16artworkcover.png
    

注意:以上也是我的文件夹结构。

,但我的要求是:

jtax-issue11-16title.xml
jtax-issue11-16artwork
jtax-issue11-16artworkcover.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文件。

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

鉴于您在$current_path中呼叫find()时,只需将.传递给find()即可。这样,您在$File::Find::name中获得的所有路径都将相对于当前目录;

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

将为您提供:

之类的路径
.jtax-issue11-16title.xml
.jtax-issue11-16artwork
.jtax-issue11-16artworkcover.png

但是,如果对您很重要,则可以使用s/^.\//从该路径的开头删除.。最简单的地方可能是建造@inventory

@inventory = map { s/^.\//; $_ } @inventory;

我将在文件中添加 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");

最新更新