如何在Perl中像UNIX中的tar一样归档目录?

9
我想要归档一个目录(我不知道是否可以称之为“我想要tar一个目录”)。我希望在解压缩时保留访问权限。我应该如何在Perl中解决这个问题。
谢谢您的回复,但我之所以要用Perl是因为我希望它独立于平台。我想将一个大文件传输到多个机器上。这些机器可以是任何平台。我应该能够正确地解压缩这个tar文件,对吧?所以我想编写自己的tar和untar程序。我之所以使用Perl是为了使其独立于平台。所以我不能通过在脚本中打开shell等方式来使用tar命令。Archive::Tar模块只处理tar文件,但它没有归档文件的选项。

tar出了什么问题?请说明为什么您不能或不会使用tar来完成此任务。 - S.Lott
是的,“压缩目录”是一个常见的短语。 - zoul
我不明白你对Archive::Tar的问题。你可以像这样创建归档文件:Archive::Tar->create_archive( 'out.tgz', COMPRESSION_GZIP, @filelist);那zip呢?它在Linux、Windows和Mac上都有。 - Mathieu Longtin
您需要安装IO::Zlib(跨平台,在5.10.0中为核心)才能使用GZIP压缩。或者,您可以使用Archive::Zip(同样跨平台,在5.10.0中为核心)创建zip归档文件。在Perl中,tar包含在Archive::Tar中。它被称为ptar。 - Alexandr Ciornii
5个回答

10

这里有一个简单的例子:

#!/usr/bin/perl -w

use strict;
use warnings 'all';
use Archive::Tar;

# Create a new tar object:
my $tar = Archive::Tar->new();

# Add some files:
$tar->add_files( </path/to/files/*.html> );
# */ fix syntax highlighing in stackoverflow.com

# Finished:
$tar->write( 'file.tar' );

# Now extract:
my $tar = Archive::Tar->new();
$tar->read( 'file.tar' );
$tar->extract();

9

需要两个参数:压缩的tar文件名和你想在tar文件中创建的目录名。

例如:
tarcvf test.tar.gz mydir
#!/usr/bin/perl -w 

use strict;
use warnings 'all';
use Archive::Tar;
use File::Find;


my $archive=$ARGV[0];
my $dir=$ARGV[1];

if ($#ARGV != 1) {
    print "usage: tarcvf test.tar.gz directory\n";
    exit;
}

# Create inventory of files & directories
my @inventory = ();
find (sub { push @inventory, $File::Find::name }, $dir);

# Create a new tar object
my $tar = Archive::Tar->new();

$tar->add_files( @inventory );

# Write compressed tar file
$tar->write( $archive, 9 );

1
这个答案应该得到更多的投票,因为它正确回答了如何将一个目录及其内容打包成tar文件。 - Petr Matousu

7

你可能想查看CPAN上的 Archive::Tar。 (我只是猜测,我自己从未使用过。)为什么要坚持使用Perl来做这件事呢?


ActivePerl 中提供了 Archive tar。 - Mathieu Longtin

3
你可以使用 Archive::Tar Perl 模块,或者直接执行 tar 命令。
如果你选择使用命令行中的 tar 命令,需要使用 -p 选项来保留文件权限。
如果你只是想简单地将目录打包成 tar 包,建议直接执行命令,不需要使用 Perl。如果之后需要进行一些复杂处理,可能需要使用 Perl,具体取决于情况。

2
我觉得rsync可能是更好的解决方案,但你没有提及其他约束条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接