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

Deadly 提交于 2019-12-05 23:01:00

问题


I want to archive a directory (I don't know whether I can call "I want to tar a directory"). I want to preserve the access permissions at the other end when I un-tar it. I should I tackle this problem in perl.

Thanks for the response but why I'm asking for doing it Perl is I want it independent of the platforms. I want to transfer one big file to multiple machines. Those machines can be of any platform. I should be able to untar this tar file properly right? So I want to write my own tar and untar programs. Why I'm using Perl is to make it platform independent. So I can not use tar command by opening the shell in script and stuff like that. The Archive::Tar module only deals with tarred file but it has no option to archive files.


回答1:


Here is a simple example:

#!/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();



回答2:


You might want to look at Archive::Tar on CPAN. (I am just guessing, I have never used it myself.) Why do you insist on doing it in Perl?




回答3:


Two parameters; the name of the compressed tar file and the name of directory you want in the tar file. eg

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 );



回答4:


You can use the Archive::Tar Perl module, or you can execute tar directly.

If you run with the option of using tar from the commandline, use the -p flag to preserve permissions.

If you are literally just looking to tar up the directory, I'd just run the command directly, you don't need to use Perl. If you need to do some fancy processing afterwards, maybe you should. It depends.




回答5:


It sounds to me like rsync might be a better solution for this, but you haven't said much about what other constraints you have.



来源:https://stackoverflow.com/questions/515553/how-can-i-archive-a-directory-in-perl-like-tar-does-in-unix

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!