如何在UNIX中像使用tar一样在Perl中存档目录?

问题描述:

我想存档一个目录(我不知道我是否可以调用“我想打个目录”)。当我解压缩时,我想在另一端保留访问权限。我应该在perl中解决这个问题。如何在UNIX中像使用tar一样在Perl中存档目录?

感谢您的回应,但为什么我要求这样做Perl是我希望它独立于平台。我想将一个大文件传输到多台机器。这些机器可以是任何平台。我应该能够正确解压这个tar文件吗?所以我想写我自己的焦油和解压程序。为什么我使用Perl是为了使它与平台无关。所以我不能通过在脚本中打开shell以及类似的东西来使用tar命令。 Archive::Tar模块只处理tar文件,但它没有选项来归档文件。

+0

这有什么错焦油?请包括你不能或不会使用tar的原因。 – 2009-02-05 11:51:27

+0

是的,“tar目录”是一个常用的短语。 – zoul 2009-02-05 11:51:53

下面是一个简单的例子:

#!/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 *.com 

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

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

你可能想看看CPAN上的Archive::Tar。 (我只是猜测,我从来没有用过它。)为什么你坚持用Perl来做?

您可以使用Archive :: Tar Perl模块,也可以直接执行tar。

如果从命令行使用tar选项运行,请使用-p标志来保留权限。

如果你真的只是在寻找tar目录,我只是直接运行命令,你不需要使用Perl。如果你之后需要做一些奇特的处理,也许你应该。这取决于。

这听起来好像rsync的可能是这更好的解决办法,但是你有没有说太多关于你有什么其他约束。

两个参数;压缩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);