在目录中按组大小压缩文件

Posted

技术标签:

【中文标题】在目录中按组大小压缩文件【英文标题】:Zipping files by group size in a directory 【发布时间】:2011-09-14 18:13:24 【问题描述】:

我有 2 个目录,我必须打开并压缩其中的所有文件。我的问题是我的 zip 文件每个只能是 5MB,而且这些文件很大。在压缩它们之前,我必须了解如何按大小对这些文件进行分组。我想使用 Perl 的 Archive::Zip 模块来做到这一点。我有一些代码,但我想知道这里是否有人知道这样做的方法,这里是代码:

#!/perl/bin/perl -w
use strict;
use warnings;

use Archive::Zip qw/AZ_OK/;
use File::Temp qw/tempfile/;

use constant MB => 1024 * 1024;

#my @dir = '/dir1 dir2/';
my $dir = qw( dir1/);

my @files = do 
 opendir my $fd, "$dir" or die $! or die $!;
 grep -f, map  "$dir$_", readdir $fd;
;

my $zip = Archive::Zip->new;
my $total;
my $limit = 5*MB;



foreach my $file (@files) 

 my $temp = Archive::Zip->new;

 my $member = $temp->addFile($file);
 next unless $member->compressedSize;

 my $fh = tempfile();
 $temp->writeToFileHandle($fh) == AZ_OK or die $!;

 $zip->addMember($member);
 $total += $member->compressedSize;
 die "$total bytes exceeds archive size limit" if $total > $limit;



print "Total archive size: $total bytes\n\n";

$zip->writeToFileNamed('zipped.zip') == AZ_OK or die $!;

谢谢!

【问题讨论】:

有什么理由需要使用 perl?命令行 zip 实用程序有一个 -s 开关,可以将 zip 文件拆分为特定大小。 是的,它必须在 Perl 中,因为它将是我正在处理的当前程序的一部分。 【参考方案1】:

恕我直言,您正在解决错误的问题。如果您需要将文件压缩成 5M 的块,为什么不将它们全部压缩在一起,然后拆分成 5M 的块呢?

您可以在 perl 内部进行拆分(一个很好的例子是here);或者对于不太便携的解决方案,使用系统命令 split(在 Unix/Linux 上可用;有一个 DOS port as well)

【讨论】:

我不能分块做,我必须按文件大小做,我不能把任何文件切成两半。 @Andre: 1. 当最大的文件压缩到 >5M 时会发生什么? @Andre: 2. 你能解释一下为什么不能把它们切成两半吗? 我要FTP这些zip文件,其中一个要求是如果压缩目录中的文件不能大于5MB,如果是,我需要将它压缩成5MB的zip文件.假设这两个目录将有 13MB 的 zip 文件。我需要计算一下并制作 2 个 5MB 的 zip 文件和一个 3MB 的 zip 文件,然后将它们全部 FTP。 @Andre - 你没有回答我的问题。很明显为什么每个文件需要小于 5MB。我不明白的是,为什么你不能制作 1 个 10MB 的 zip 文件,将其分成两个 5 MB 的“.part”半部分,将这些部分通过 FTP 传输(它们本身不是 zip 文件,但可以合并成一个大的 zip 文件),然后在目标系统上将 2 半重新组装成一个 10MB 的 zip 文件。

以上是关于在目录中按组大小压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

怎么将pdf文件压缩到指定大小?

Linux下的文件系统

linux系统文件归档(解/压缩)命令

jpg图片怎么压缩大小

试图在 python 中压缩一些文件。但是大小并没有被压缩。

war 包解压 压缩