Como posso arquivar um diretório em Perl como o alcatrão faz em UNIX?

StackOverflow https://stackoverflow.com/questions/515553

  •  21-08-2019
  •  | 
  •  

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 .

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top