Hi Gurus,
I am stuck. I have thousands of jpegs in hundreds of folders and I
would like to do a section by section tally of the number and file
sizes of all the files.
I am using File::Find as it is quick and good at recursively
searching dirs. The files are stored in folder under a letter, then a
section number then the file. So A100/002 is stored in
/usr2/images/a/100/002.jpg. The 'a' will often be a symlink to a
different disk but that hasn't been a problem.
The problem is my section tallies are either getting zero'ed or
accumulating (depending on where I re-initalise the variables). So
instead of getting:
a Size: 6460.38MB Number: 2367
b Size: 8022.31MB Number: 3034
......
I get:
a size: 6460.38MB number:2367
b size: 0MB number:0
e size: 0MB number:0
Heres what I have done:
============== JPEG_COUNT.PL =======
#!/bin/perl
use File::Find;
#use strict;
use diagnostics;
my @dirs = qw(a b e g h m n p r s t v z);
my $images_root = "/usr2/images/";
my @d;
my $total_size = 0;
my $total_num = 0;
# Create an array of all the dirs to check.
foreach my $i (@dirs) {
my $toplevel = "$images_root"."$i"."/";
push(@d,$toplevel);
}
# Cycle through dirs and get listing.
foreach my $dir (@d) {
my $sect_sz = 0;
my $file_size = 0;
my $sect_size = 0;
my $sect_num = 0;
finddepth({wanted => \&find, follow=>1},$dir);
sub find {
if ($_ !~ /jpg/) {
next;
}
++$sect_num;
my ($sz) = ((stat($_))[7] * 0.000001);
$file_size = sprintf("%.2f",$sz);
$sect_sz += $file_size;
$sect_size = sprintf("%.2f",$sect_sz);
# print "DEBUG: \$_=$_, $sect_size\n";
};
my ($let) = substr($dir,-2,1);
print "$let size: ${sect_size}MB number:$sect_num\n";
}
=========================
I could side-step this and simply do `du -k /path/to/jpegs` but I
would like to know what I am doing wrong.
Thanx.
Dp.