Hi Monks!
I need to zip a bunch of files in directories, but I have to make sure that the zip file(s) will not exceed a certain size. I am trying to group these files into, lets say about .5GB groups, but anyway I am having a lot a problems here, my code is going into a infinity loop on line 42. Bottom line my logic is not working. It would be nice if someone could take a look at this code to see if there is a better way of doing what I am trying to do here. Now, the code:
#!/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, grep { -f && -s _ >= $min_size && -s _ <= $max_size & +& /\.pdf/} read_dir( $d, prefix => 1 ); } my $limit = 5_000_000; print "Getting file sizes...\n"; $_ = -s $_ foreach (@files); #Create zip with $limit of files per zip print "Creating zips...\n"; my $zip_number = 1; my $total_size = 0; my @other_group; while(@files or @other_group) { #Find biggest file that will fit my $next_index = 0; $next_index++ while( ($next_index <= $#files) && ($total_size + + $files[$next_index] > $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, 0); $total_size += $other_group[0]; } #Otherwise, zip this group, and start a new group else { # print this for testing, these files will be zipped in the $z +ip_number.zip file foreach my $testfiles (@other_group) { print "\n$testfiles - $zip_number.zip\n"; } #Clear this group info, and increment zip number @other_group = (); $total_size = 0; $zip_number++; } }
Thanks for the help!!!

In reply to Grouping files before zipping! by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.