Как я могу заархивировать каталог в Perl, как tar делает в UNIX? - PullRequest
7 голосов
/ 05 февраля 2009

Я хочу заархивировать каталог (я не знаю, могу ли я назвать «Я хочу заархивировать каталог»). Я хочу сохранить права доступа на другом конце, когда я разархивирую его. Я должен решить эту проблему в perl.

Спасибо за ответ, но почему я прошу это сделать, Perl, я хочу, чтобы он был независим от платформ. Я хочу перенести один большой файл на несколько машин. Эти машины могут быть любой платформы. Я должен быть в состоянии распаковать этот файл правильно, верно? Поэтому я хочу написать свои собственные программы tar и untar. Почему я использую Perl, чтобы сделать его независимым от платформы. Поэтому я не могу использовать команду tar, открыв оболочку в скрипте и все в таком духе. Модуль Archive :: Tar работает только с tar-файлом, но не имеет возможности архивировать файлы.

Ответы [ 5 ]

9 голосов
/ 05 февраля 2009

Вот простой пример:

#!/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();
7 голосов
/ 05 февраля 2009

Возможно, вы захотите посмотреть на Archive :: Tar на CPAN. (Я просто догадываюсь, я никогда не использовал это сам.) Почему вы настаиваете делать это в Perl?

6 голосов
/ 16 декабря 2009

Два параметра; имя сжатого файла 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 );
3 голосов
/ 05 февраля 2009

Вы можете использовать модуль Archive :: Tar Perl, или вы можете выполнить tar напрямую.

Если вы используете опцию tar из командной строки, используйте флаг -p для сохранения разрешений.

Если вы в буквальном смысле просто ищете каталог, я просто запустил бы команду, вам не нужно использовать Perl. Если вам нужно сделать какую-то необычную обработку позже, возможно, вам следует. Это зависит.

2 голосов
/ 07 февраля 2009

Мне кажется, что rsync может быть лучшим решением для этого, но вы не очень много говорили о других ограничениях, которые у вас есть.

...