2009-02-05 5 views
7

Ich möchte ein Verzeichnis archivieren (ich weiß nicht, ob ich "Ich will ein Verzeichnis tarieren"). Ich möchte die Zugriffsberechtigungen am anderen Ende erhalten, wenn ich es entwerfe. Ich sollte dieses Problem in Perl angehen.Wie kann ich ein Verzeichnis in Perl wie tar in UNIX archivieren?

Danke für die Antwort, aber warum ich es tun will Perl ist ich will es unabhängig von den Plattformen. Ich möchte eine große Datei auf mehrere Rechner übertragen. Diese Maschinen können von jeder Plattform sein. Ich sollte in der Lage sein, diese TAR-Datei richtig zu entpacken, oder? Also möchte ich meine eigenen Tar- und Untar-Programme schreiben. Warum ich Perl verwende, um es plattformunabhängig zu machen. Also kann ich den tar-Befehl nicht verwenden, indem ich die Shell im Skript und so ähnlich öffne. Das Archive::Tar Modul behandelt nur geteerte Dateien, aber es hat keine Option Dateien zu archivieren.

+0

Was mit Teer falsch? Bitte geben Sie die Gründe an, warum Sie tar nicht verwenden können oder wollen. –

+0

Ja, "ein Verzeichnis tarieren" ist eine geläufige Phrase. – zoul

+0

Ich habe kein Problem mit Archive :: Tar. Sie können Archive wie folgt anlegen: Archiv :: Tar-> create_archive ('out.tgz', COMPRESSION_GZIP, @filelist); Was ist mit zip? Es ist auf Linux, Windows und Mac. –

Antwort

9

Hier ist ein einfaches Beispiel:

#!/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

Sie möchten vielleicht Archive::Tar auf CPAN betrachten. (Ich rate nur, ich habe es nie selbst benutzt.) Warum bestehen Sie darauf, es in Perl zu machen?

+0

Ich möchte es plattformunabhängig sein ... – Ram

+0

Archiv tar ist mit ActivePerl verfügbar. –

3

Sie können das Archive :: Tear Perl-Modul verwenden, oder Sie können tar direkt ausführen.

Wenn Sie mit der Option "tar" über die Befehlszeile ausführen, verwenden Sie das Flag -p, um Berechtigungen beizubehalten.

Wenn Sie buchstäblich nur suchen, um das Verzeichnis zu tarnen, würde ich nur den Befehl direkt ausführen, müssen Sie nicht Perl verwenden. Wenn Sie danach noch etwas ausgefallene Bearbeitung machen müssen, sollten Sie es vielleicht tun. Es kommt darauf an.

2

Es klingt für mich wie rsync eine bessere Lösung für dieses sein könnte, aber Sie haben gesagt, nicht viel über das, was andere Einschränkungen, die Sie haben.

4

Zwei Parameter; Der Name der komprimierten TAR-Datei und der Name des gewünschten Verzeichnisses in der TAR-Datei. zB

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