linux 如何到达一长串嵌套拉链中的最后一个拉链?

wmvff8tz  于 2023-01-04  发布在  Linux
关注(0)|答案(1)|浏览(124)

我有一个任务,以达到最后一个文件在一长串嵌套的压缩文件。他们这样去:
3301.zip | 3300.zip | 3299.zip | ...| 1.zip
基本上,我必须从一个归档文件中提取另一个归档文件3300次,才能到达1.zip中的文件。
我一直在寻找这样做的方法,但也许我的搜索词是不正确的,或者我错过了一些东西。我尝试了“到达最后一个文件嵌套的zips”,“提取嵌套的zips”。我的工作环境是Linux,我尝试了几个终端命令和工具。没有什么做我想要的。

but5z9lq

but5z9lq1#

下面是一个Perl脚本nested-unzip,它遍历嵌套的zip文件并打印最里面的zip文件的内容。

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip::SimpleZip qw($SimpleZipError) ;
use File::Basename;
use Text::Glob;

sub walk
{
    my $zip = shift;
    my $path = shift ;
    my $depth = shift // 1 ;

    my $indent = '  ' x $depth;
    for my $p (<$path/*>)
    {
        my $filename = basename $p;
        my $dir = dirname $p;

        if (-d $p)
        {
            print $indent . "$filename [as $filename.zip]\n";

            my $newfh = $zip->openMember(Name => $filename . ".zip");

            my $newzip = new Archive::Zip::SimpleZip $newfh, Stream => 1
                    or die "Cannot create zip file '$filename.zip': $SimpleZipError\n" ;

            walk($newzip, $p, $depth + 1);
            $newzip->close();
        }
        else
        {
            print $indent . "$filename\n";
            $zip->add($p, Name => $filename);
        }
    }
}

my $zipfile = $ARGV[0];
my $path = $ARGV[1] ;

my $zip = new Archive::Zip::SimpleZip $zipfile
        or die "Cannot create zip file '$zipfile': $SimpleZipError\n" ;

print "$path\n";
walk($zip, $path);

创建一个嵌套的压缩文件来播放

$ echo hello >hello.txt
$ zip 1.zip hello.txt 
$ zip 2.zip 1.zip
$ zip 3.zip 2.zip

最后运行脚本

$ perl nested-unzip 3.zip 
3.zip
  2.zip
    1.zip
      hello.txt

相关问题