#!/usr/bin/perl -w use strict; use File::Find; use File::Basename; use File::stat; use File::Slurp qw(read_dir); my @directories = qw( /all_files_a /all_files_b); my @files; my $min_size = 1024; # bytes => 1K my $max_size = 10485760; # bytes =>10MB for my $d (@directories) { push @files, { name => "d/$_", size => -s $_ } for grep { -f && -s _ >= $min_size && -s _ <= $max_size && /\.pdf/} read_dir( $d, prefix => 1 ); } my $limit = 5_000_000; #Create zip with $limit of files per zip print "Creating zips...\n"; my $zip_number = 1; my $total_size = 0; my @other_group; my $next_index = 0; while(@files) { #Find biggest file that will fit $next_index++ while( ($next_index <= $#files) && ($total_size + $files[$next_index]->{size} > $limit) ); #If there was a file that will fit, add it to @other_group if($next_index <= $#files) { push @other_group, splice(@files, $next_index, 1); $total_size += $other_group[-1]->{size}; $next_index++; } #Otherwise, zip this group, and start a new group else { # print this for testing, these files will be zipped in the $zip_number.zip file foreach my $testfiles (@other_group) { print $testfiles->{name}," - $zip_number.zip\n"; } #Clear this group info, and increment zip number @other_group = (); $total_size = 0; $zip_number++; $next_index = 0; } }