Archive::Tar 模块备份文件和文件夹,但不备份文件夹中的文件

Archive::Tar module backs up files and folders, but not files in folders

基本问题。

我想使用 Perl 的 Archive::Tar 模块来备份东西。我打算使用 Archive::Tar 来备份文件和文件夹以及文件夹中的文件。使用我当前的代码,前两个有效,但第三个无效。

重现步骤:

  1. 创建示例目录。
  2. 在示例目录中,创建两个目录和一个 .txt 文件。
  3. 使用 vim,在 .txt 文件中写入任何内容。
  4. 在示例目录中的其中一个目录中,重复第二步和第三步。
  5. 在示例目录中,创建一个 perl 脚本。
  6. 将下面的代码复制到脚本中。
  7. 运行 脚本。在框中,键入 .txt 文件的名称和两个目录。
  8. 按下大压缩按钮。
  9. 在压缩目录中打开新的 .tbz 文件。

代码。

use strict; use warnings;

use Archive::Tar;
use Tk;

my $mw = MainWindow -> new;
$mw -> Label ( -text => "Please type the files you wish to backup, separated by spaces." ) -> pack;

my $inputEntry = $mw -> Entry ( -width => 30 );
$inputEntry -> pack;

$mw -> Button ( -text => "Compress!", -command => sub { compress() } ) -> pack;

MainLoop;

sub compress {
    my $input = $inputEntry -> get;
    my @input;
    unless ( $input !~ m/ / ) {
        @input = split ( m/ /, $input );
    } else {
        @input = ( $input );
    }
    Archive::Tar -> create_archive ( "TEST.tbz", COMPRESS_BZIP, @input )    
}

您的重现步骤不明确,更多示例可能会有所帮助,但您的脚本对我来说似乎工作正常。我能够将文件夹和文件以及文件夹中的文件成功添加到存档中。对于文件夹中的每个文件,我必须键入整个相对路径,例如。 'sample/file1.txt'.

您可能正在寻找一种在文件夹中自动添加文件的方法。这样的事情就可以了:

use strict; use warnings;

use Archive::Tar;
use Tk;

my $mw = MainWindow -> new;
$mw -> Label ( -text => "Please type the files you wish to backup, separated by spaces." ) -> pack;

my $inputEntry = $mw -> Entry ( -width => 30 );
$inputEntry -> pack;

$mw -> Button ( -text => "Compress!", -command => sub { compress() } ) -> pack;

MainLoop;

sub compress {
    my $input = $inputEntry -> get;
    my @input; 
    my @dirfiles;
    unless ( $input !~ m/ / ) {
        @input = split ( m/ /, $input );
    } else {
        @input = ( $input );
    }

    foreach(@input) { if(-d $_) { push(@dirfiles,glob "'${_}/*'"); } }
    push(@input,@dirfiles);

    Archive::Tar -> create_archive ( "TEST.tbz", COMPRESS_BZIP, @input )
}

我认为仍然存在一些问题,例如:此脚本在名称中包含空格的 files/folders 上似乎失败,即使在转义或引用时也是如此。