Рекурсивный вывод содержимого архива 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?


person django    schedule 20.05.2013    source источник
comment
Как насчет того, чтобы извлечь дополнительный zip-файл во временную папку и потом очистить его?   -  person albusshin    schedule 20.05.2013


Ответы (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
person Birei    schedule 20.05.2013

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

$ arkfind ABCD.zip
ABCD.zip
  > somefile.txt
  > somezip.zip
      > (contents of somezip.zip)
  > someother.tar
      > (contents of someother.tar)
person detly    schedule 05.07.2013