2009-02-05 12 views
7

Quiero archivar un directorio (no sé si puedo llamar "Quiero tar un directorio"). Deseo conservar los permisos de acceso en el otro extremo cuando lo elimine. Debería abordar este problema en Perl.¿Cómo puedo archivar un directorio en Perl como lo hace tar en UNIX?

Gracias por la respuesta, pero por qué lo estoy pidiendo Perl es que lo quiero independientemente 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 correctamente ¿no? Así que quiero escribir mis propios programas tar y untar. Por qué estoy usando Perl es hacerlo independiente de la plataforma. Así que no puedo usar el comando tar abriendo el shell en script y cosas así. El módulo Archive::Tar solo trata con el archivo tarred pero no tiene la opción de archivar archivos.

+0

¿Qué pasa con alquitrán? Por favor, incluya las razones por las que no puede o no usará tar para esto. –

+0

Sí, "tar un directorio" es una frase común. – zoul

+0

No entiendo tu problema con Archive :: Tar. Puede crear archivos como este: Archive :: Tar-> create_archive ('out.tgz', COMPRESSION_GZIP, @filelist); ¿Qué tal zip? Está en linux, windows y mac. –

Respuesta

9

Aquí está 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(); 
7

Es posible que desee mirar Archive::Tar en CPAN. (Estoy adivinando, nunca lo he usado). ¿Por qué insistes en hacerlo en Perl?

+0

Quiero que sea independiente de la plataforma ... – Ram

+0

Archivo tar está disponible con ActivePerl. –

3

Puede usar el módulo Archive :: Tar Perl, o puede ejecutar tar directamente.

Si ejecuta con la opción de utilizar tar desde la línea de comandos, use el indicador -p para conservar los permisos.

Si está literalmente buscando actualizar el directorio, simplemente ejecutaría el comando directamente, no es necesario que use Perl. Si necesita hacer un procesamiento elegante después, tal vez debería. Depende.

2

Me suena como rsync podría ser una mejor solución para esto, pero no han dicho mucho acerca de qué otras limitaciones que tiene.

4

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