我会尝试制作.tar或.gz文件。但我有一些问题,如:
它采用完整的路径
D:\test\jtax-issue11-16\title.xml
D:\test\jtax-issue11-16\artwork
D:\test\jtax-issue11-16\artwork\cover.png
注意:上面也是我的文件夹结构。
但我的要求是:
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文件。
答案 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");