我了解如何获取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也可以有其他拉链等。如何通过递归来做到这一点?可能使用bash / perl脚本?
答案 0 :(得分:3)
这里有一个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
答案 1 :(得分:0)
我写了一个Python脚本来递归搜索档案,名为arkfind。您可以省略搜索文本,只将所有内容列为任意深度。
$ arkfind ABCD.zip
ABCD.zip
> somefile.txt
> somezip.zip
> (contents of somezip.zip)
> someother.tar
> (contents of someother.tar)