递归列出tar / zip存档的内容

时间:2013-05-20 06:42:45

标签: linux perl bash zip tar

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

$ arkfind ABCD.zip
ABCD.zip
  > somefile.txt
  > somezip.zip
      > (contents of somezip.zip)
  > someother.tar
      > (contents of someother.tar)