Question

Je suis en utilisant le code ci-dessous Perl pour lister les fichiers contenus dans une archive tar. La taille de l'archive tar est toujours de 15MB.

my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;

exécution de ce code me donne une erreur « Mémoire ». J'ai environ 512 Mo dans mon système Linux et je ne veux pas augmenter la mémoire de mon système. Quelqu'un peut-il s'il vous plaît me suggérer si ce code peut être modifié pour une meilleure performance ou un autre code pour lister les fichiers dans l'archive tar.

Était-ce utile?

La solution

J'ai essayé sur un grand goudron et obtenu une erreur aussi. Probablement un bug dans libs. Ce qui suit a fonctionné pour moi:

@files = split/\n/, `tar tf $file`

Autres conseils

De Archive::Tar FAQ :

  

est pas Archive :: Tar lent?   Oui, ça l'est. Il est perl pur, il est donc beaucoup plus lent alors votre / bin / tar Cependant, il est très portable. Si la vitesse est un problème, pensez à utiliser / bin / tar à la place.

     

est pas Archive :: Tar plus lourd sur la mémoire que / bin / tar?   Oui il est, voir la réponse précédente. Depuis Compress :: Zlib et donc IO :: Zlib ne prend pas en charge recherchent de leur handles de fichiers, il y a peu de choix que de lire l'archive en mémoire. Ceci est ok si vous voulez faire la manipulation en mémoire de l'archive.

     

Si vous voulez juste extraire, utiliser la méthode de classe extract_archive à la place. Il permettra d'optimiser et d'écrire sur le disque immédiatement.

     

Une autre option est d'utiliser la méthode de classe iter itérer sur les fichiers du tarball sans les lire tous en mémoire à la fois.

basé sur ci-dessus cela devrait être la solution (non testé):

my $next = Archive::Tar->iter( $file );

while ( my $f = $next->() ) {
    say $f->name;
}

/ I3az /

si Perl n'est pas un must, l'utilisation du goudron

$ tar tvf file.tar
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top