0

我了解如何获取 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 脚本?

4

2 回答 2

3

这是一个perl脚本,它将列出所有文件,包括递归ziptar文件:

#!/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
于 2013-05-20T08:28:47.600 回答
0

我编写了一个 Python 脚本来递归搜索档案,称为arkfind。您可以省略搜索文本以仅将所有内容列出到任意深度。

$ arkfind ABCD.zip
ABCD.zip
  > somefile.txt
  > somezip.zip
      > (contents of somezip.zip)
  > someother.tar
      > (contents of someother.tar)
于 2013-07-05T00:16:11.447 回答