Como posso arquivar um diretório em Perl como o alcatrão faz em UNIX?
Pergunta
Eu quero arquivar um diretório (Eu não sei se eu posso chamar "Quero tar um diretório"). Eu quero preservar as permissões de acesso no outro extremo quando eu un-tar-lo. Eu devo enfrentar este problema em perl.
Obrigado pela resposta, mas por isso que eu estou pedindo para fazê-lo Perl é que eu quero que independente das plataformas. Eu quero transferir um arquivo grande em várias máquinas. Essas máquinas podem ser de qualquer plataforma. I deve ser capaz de descompactar esse arquivo tar adequadamente certo? Então, eu quero escrever meu próprio alcatrão e programas untar. Por que eu estou usando Perl é torná-lo independente de plataforma. Então eu não posso usar o comando tar abrindo o shell no roteiro e coisas assim. A Archive :: Tar módulo só lida com arquivos alcatroada mas não tem opção para arquivos compactados .
Solução
Aqui está um exemplo simples:
#!/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();
Outras dicas
Você pode querer olhar em Archive: : Tar no CPAN. (Estou apenas supondo, eu nunca usei isso mesmo.) Por que você insiste em fazê-lo em Perl?
Dois parâmetros; o nome do arquivo tar compactado eo nome do diretório que você deseja no arquivo tar. 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 );
Você pode usar o módulo Archive :: Tar Perl, ou você pode executar tar diretamente.
Se você executar com a opção de usar tar a partir da linha de comando, use o sinalizador -p para preservar as permissões.
Se você está literalmente olhando apenas para tar o diretório, eu tinha acabado de executar o comando diretamente, você não precisa usar Perl. Se você precisar fazer algum processamento de fantasia depois, talvez você deve. Depende.
Parece-me como rsync pode ser uma solução melhor para isso, mas você não disse muito sobre o que as outras restrições que você tem.