Рекурсивное перечисление содержимого архива 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)