在 Perl 脚本中无法将目录添加到存档

Posted

技术标签:

【中文标题】在 Perl 脚本中无法将目录添加到存档【英文标题】:In Perl Script Not able to add a directory to Archive 【发布时间】:2020-12-21 19:25:37 【问题描述】:

我必须使用 Perl 脚本将 Windows 目录添加到存档。执行以下脚本后,仅目录名称被存档,并且“C:\Software\Postgres”下的目录内容不包含在存档中。你能帮我在下面的脚本中出错的地方吗?

use warnings;
use strict;
use Archive::Tar;

tar_BKUP();

sub tar_BKUP
  my $src_D = 'C:\Software\Postgres';
  my $dst_Tar = 'C:\temp\Postgres.tar';
  my $tar = Archive::Tar->new();
  $tar->add_files($src_D);
  $tar->write($dst_Tar);

【问题讨论】:

***.com/questions/515553/… 我想这回答了你的问题 感谢您的回复,我已经尝试了***.com/questions/515553/… 中提到的逻辑,但没有奏效。请注意我正在 Windows 上尝试 有趣的是,在 Perl 中,Windows 路径不需要使用反斜杠,您可以使用正斜杠 / 并避免字符串插值中的反斜杠问题。 我在您的代码中添加了一些空格。空格对于使您的代码易于阅读非常有用。请考虑以后自己添加。 【参考方案1】:

这里是一个使用File::Find::Rule的例子:

use warnings;
use strict;
use Archive::Tar;
use File::Find::Rule;

tar_BKUP();
sub tar_BKUP
    my $src_D = 'C:/Software/Postgres';
    my $dst_Tar ='C:/temp/Postgres.tar';
    my $tar = Archive::Tar->new();
    my @files = File::Find::Rule->file->in($src_D);
    $tar->add_files(@files);
    $tar->write($dst_Tar);

另见How can I archive a directory in Perl like tar does in UNIX?

【讨论】:

【参考方案2】:

add_files() 方法的文档是这样说的:

$tar->add_files(@filenamelist)

获取文件名列表并将它们添加到内存存档中。

因此,您将文件名列表传递给它,这些文件将被添加到存档中。看起来您认为您可以将一个目录传递给它并一次性添加该目录中的所有文件。但它没有记录可以像那样工作。

如果您知道源目录下没有子目录,那么您可以这样做:

$tar->add_files( glob( "$src_D/*" ) );

但如果需要包含子目录的内容,那么Håkon's answer using File::Find::Rule 是一个不错的方法。

如果 Perl 模块没有按照您的预期工作,那么检查文档始终是一个很好的第一步 :-)

【讨论】:

以上是关于在 Perl 脚本中无法将目录添加到存档的主要内容,如果未能解决你的问题,请参考以下文章

Perl:将当前目录包含到@INC吗?

将perl脚本添加到makefile

如何使用 perl Archive::Zip 将文件添加到存档中?

PowerShell脚本将所有旧文件存档在基于月份的目录中

在网页上运行 perl 脚本后保存文件

Jenkins - 如果构建失败,将下载链接添加到文件