#!/usr/bin/perl -w use strict; use Archive::Zip qw/AZ_OK/; use File::Temp qw/tempfile/; use constant MB => 1024 * 1024; my $dir = qw( zip_this/); my @files = do { opendir my $fd, "$dir" or die $! or die $!; grep -f, map "$dir$_", readdir $fd; }; my $zip = Archive::Zip->new; my $total = 0; my $limit = 5*MB; my $FileCount = 0; my $archiveCount = 0; 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 $!; if ($total + $member->compressedSize > $limit) { $zip->writeToFileNamed("zipped_$archiveCount.zip") == AZ_OK or die $!; $archiveCount++; print "Total archive size: $total bytes\n\n"; $total = 0; $zip = Archive::Zip->new; } $zip->addMember($member); $total += $member->compressedSize; } print "Total archive size: $total bytes\n"; $zip->writeToFileNamed("zipped_$archiveCount.zip") == AZ_OK or die $!;