Рекурсивное перечисление содержимого архива tar/zip

Я понимаю, как получить содержимое файлов zip / tar, например: http://www.if-not-true-then-false.com/2010/list-tar-tar-gz-tar-bz2-contents/

Но в моем случае: я хочу получить все содержимое zip-архива.

ABCD.zip
  -->somefile.txt
  -->somezip.zip
  -->someother.tar

ЦЕЛЬ: Я хочу получить содержимое ABCD.zip, чтобы я также мог получить то, что находится внутри somezip.zip и someother.tar, и someother.tar также может иметь некоторые другие zip-файлы и т. Д. Как я могу сделать это с помощью рекурсии? Возможно со скриптом bash / perl?

2 ответа

Решение

Здесь perl скрипт, который перечислит все файлы, включая рекурсию zip а также tar файлы:

#!/usr/bin/env perl

use strict;
use warnings;
use Archive::Extract;
use File::Temp;

my ($indent) = (0);

die qq|Usage: perl $0 <zip-file>\n| unless @ARGV == 1;

printf qq|%s\n|, $ARGV[0];
$indent += 2;
recursive_extract( shift );

exit 0;

sub recursive_extract {
        my ($file) = @_; 
        my $tmpdir = File::Temp->newdir;

        my $ae = Archive::Extract->new(
                archive => $file,
        );  

        $ae->extract( to => $tmpdir->dirname );

        for my $f ( @{ $ae->files } ) { 
                printf qq|%s%s\n|, q| | x $indent, $f; 
                if ( $f =~ m/\.(?:zip|tar)\z/ ) { 
                        $indent += 2;
                        recursive_extract( $f );
                }   
        }   

        $indent -= 2;
}

Некоторые недостатки: он не кэширует уже обработанные файлы, поэтому, если есть идентичные сжатые файлы, он будет извлекать и читать их снова. И он будет искать сжатые файлы, глядя только по их расширению, а не по содержимому. Так что это может быть улучшено для всех, кто нуждается или хочет это.

Предполагая, что следующий скрипт назван script.pl, дай zip файл в качестве аргумента, запустив его как:

perl script.pl myzip.zip

И в моем тесте это дает что-то вроде:

myzip.zip
  f1
  f2
  f3
  f4
  mytar.tar
    f5
    f6
    f7
    f8
    testtar.tar
      f11
      f12
      f13
      f14
  testtar.tar
    f11
    f12
    f13
    f14
  testzip.zip
    fd
    fd2

Я написал скрипт Python для рекурсивного поиска в архивах, который называется arkfind. Вы можете опустить текст поиска, чтобы просто перечислить все содержимое на произвольную глубину.

$ arkfind ABCD.zip
ABCD.zip
  > somefile.txt
  > somezip.zip
      > (contents of somezip.zip)
  > someother.tar
      > (contents of someother.tar)
Другие вопросы по тегам