2009-02-05 14 views
7

Chcę zarchiwizować katalog (nie wiem, czy mogę zadzwonić "Chcę tar katalogu"). Chcę zachować uprawnienia dostępu na drugim końcu, gdy je rozpakuję. Powinienem rozwiązać ten problem w perlu.Jak mogę zarchiwizować katalog w Perlu, tak jak w UNIX?

Dziękuję za odpowiedź, ale dlaczego pytam o zrobienie tego Perl jest niezależny od platform. Chcę przenieść jeden duży plik na wiele komputerów. Te maszyny mogą być dowolnej platformy. Powinienem móc poprawnie usunąć ten plik tar, prawda? Więc chcę napisać własne programy tar i untar. Dlaczego używam Perla to uniezależnienie go od platformy. Więc nie mogę użyć polecenia tar poprzez otwarcie powłoki w skrypcie i tym podobne. Moduł Archive::Tar zajmuje się tylko plikiem tarrowym, ale nie ma opcji archiwizowania plików.

+0

Co jest złego w smole? Podaj powody, dla których nie możesz lub nie użyjesz programu tar na ten temat. –

+0

Tak, "aby zaatakować katalog" jest typową frazą. – zoul

+0

Nie otrzymuję twojego problemu z Archive :: Tar. Możesz tworzyć archiwa takie jak to: Archiwum :: Tar-> create_archive ('out.tgz', COMPRESSION_GZIP, @filelist); Co ze zipem? Jest na Linux, Windows i Mac. –

Odpowiedz

9

Oto prosty przykład:

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

Możesz chcieć spojrzeć na Archive::Tar na CPAN. (Po prostu zgaduję, nigdy sam tego nie używałem.) Dlaczego nalegasz na zrobienie tego w Perlu?

+0

Chcę, aby była niezależna od platformy ... – Ram

+0

Archiwum tar jest dostępne z ActivePerl. –

3

Możesz użyć modułu Archive :: Tar Perl lub możesz bezpośrednio uruchomić program tar.

Jeśli używasz opcji używania tar z wiersza poleceń, użyj opcji -p, aby zachować uprawnienia.

Jeśli chcesz dosłownie zaatakować katalog, po prostu uruchomię komendę bezpośrednio, nie musisz używać Perla. Jeśli chcesz później wykonać jakieś fantazyjne przetwarzanie, może powinieneś. To zależy.

2

To brzmi dla mnie jak rsync może być lepszym rozwiązaniem dla tego, ale nie powiedział o tym, co wiele innych ograniczeń masz.

4

Dwa parametry; nazwa skompresowanego pliku tar i nazwa katalogu, który chcesz znaleźć w pliku tar. np

 
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); 
Powiązane problemy