¿Cómo puedo archivar un directorio en Perl como el alquitrán hace en UNIX?

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Quiero archivar un directorio (no sé si puedo llamar "Quiero tar un directorio"). Quiero preservar los permisos de acceso en el otro extremo cuando un-tar ella. Yo debería abordar este problema en Perl.

Gracias por la respuesta, pero eso que estoy pidiendo para hacerlo Perl es lo quiero independiente de las plataformas. Quiero transferir un archivo grande a varias máquinas. Esas máquinas pueden ser de cualquier plataforma. Debería ser capaz de descomprimir este archivo tar adecuadamente el derecho? Por eso quiero escribir mi propia alquitrán y programas de untar. ¿Por qué estoy usando Perl es hacer que la plataforma independiente. Así que no puedo usar el comando tar mediante la apertura de la cáscara de guión y cosas por el estilo. El Archive :: Tar módulo sólo se ocupa de archivo alquitranado pero no tiene ninguna opción para almacenar los archivos .

¿Fue útil?

Solución

Este es un ejemplo sencillo:

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

Otros consejos

Es posible que desee ver en Archivo: : Tar en CPAN. (Sólo estoy adivinando, nunca he utilizado yo mismo.) ¿Por qué insistes en hacerlo en Perl?

dos parámetros; el nombre del archivo tar comprimido y el nombre del directorio que desea en el archivo tar. por ejemplo,

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

Puede utilizar el módulo Archive :: Tar Perl, o puede ejecutar directamente el alquitrán.

Si se ejecuta con la opción de usar el alquitrán de la línea de comandos, utilice la opción -p para preservar los permisos.

Si está literalmente a la busca de alquitrán de seguridad del directorio, que acababa de ejecutar el comando directamente, no es necesario utilizar Perl. Si necesita hacer algo de procesamiento de fantasía después, tal vez usted debería. Depende.

Me suena como rsync podría ser una mejor solución para esto, pero no ha dicho mucho acerca de lo que tienen otras limitaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top