创建多个[独立] zip 文件?

创建多个[独立] zip 文件?

我如何才能自动将一组文件压缩成多个 zip 文件(例如,每个文件大小为 2mb),并且每个 zip 文件都是一个独立的 zip 文件?(即不是多卷 zip 文件,您不能丢失任何一个文件,否则您无法解压)

有没有什么工具可以做到这一点?实际上我只需要将文件分成很多组,每组 2mb 等,是否压缩都无所谓

谢谢!

答案1

尝试一款名为 Bitser 的免费工具。它是免费的,可让您通过上下文菜单从资源管理器创建多个单独的 zip 文件。这非常简单,只需突出显示资源管理器中的文件或文件夹,右键单击并选择“添加到单独的 Zip”

www.bitser.org

答案2

您可以考虑将文件放入 zip 存档中,然后使用Adsen文件分割器

编辑:

现在我想起来这可能不是你想要的...无论如何我都会保留它。

答案3

一种方法是创建一个包含所有内容的 zip 文件,然后使用拉链分离命令(免费/开放的 Info-ZIP 软件的一部分)使用 -n 选项将其分割成适当大小的块。

该链接转到 Mac OS X 手册页,但 Info-ZIP 的软件可以在 80 年代以来几乎所有可用的硬件/操作系统组合上运行。

答案4

不幸的是,zipsplit 不适用于 2GB 以上的文件,所以我对同样的问题感到沮丧。因此,我编写了自己的快速而粗糙的 perl 脚本,它可以完成它的工作。只要文件 + 存档小于指定的最大大小,它就会将文件添加到存档中:

# Use strict Variable declaration
use strict;
use warnings;
use File::Find;

# use constant MAXSIZE    => 4700372992; # DVD File size
use constant MAXSIZE    => 1566790997; # File size for DVD to keep below 2GB limit
# use constant MAXSIZE    => 100000000; # Test

use constant ROOTDIR    => 'x:/dir_to_be_zipped'; # to be zipped directory

my $zipfilename    = "backup"; # Zip file name
my $zipfileext    = "zip"; # extension

my $counter = 0;
my $zipsize = undef;
my $flushed = 1;

my $arr = [];

find({wanted =>\&wanted, no_chdir => 1}, ROOTDIR);

flush(@{$arr});

# Callback function of FIND
sub wanted {
    my $filesize = (-s $File::Find::name);

    LABEL: {
        if ($flushed) {
            $zipsize = (-s "$zipfilename$counter.$zipfileext");
            $zipsize = 0 unless defined $zipsize;

            printf("Filesize Zip-File %s: %d\n", 
                "$zipfilename$counter.$zipfileext", $zipsize);

            $flushed = 0;

            if (($zipsize + $filesize) >= MAXSIZE) {
                $counter++;
                $flushed = 1;
                printf("Use next Zip File %d, Filesize old File: %d\n",
                    $counter, ($zipsize + $filesize));
                goto LABEL;
            }
        }
    }

    if ( $zipsize + $filesize  < MAXSIZE ) {
        printf("Adding %s (%d) to Buffer %d (%d)\n",
            $File::Find::name, $filesize, $counter, $zipsize);

        push @{$arr}, $File::Find::name;
        $zipsize += $filesize;
    }
    else {
        printf("Flushing File Buffer\n");
        flush(@{$arr});

        $flushed = 1;
        $arr = [];
        goto LABEL;

    }
}

# Flush File array to zip file
sub flush {

    # open handle to write to STDIN of zip call
    open(my $fh, "|zip -9 $zipfilename$counter.$zipfileext -@")
        or die "cannot open < $zipfilename$counter.$zipfileext: $!";

    printf("Adding %d files\n", scalar(@_));
    print $fh map {$_, "\n"} @_;
    close $fh;
}

相关内容