[Chicago-talk] array to hash and counting files

Randal L. Schwartz merlyn at stonehenge.com
Tue Dec 30 11:07:43 CST 2003

>>>>> "Jeremy" == Jeremy Hubble <jhubble at core.com> writes:

Jeremy> I have a series of directories that each have a number of 
Jeremy> subdirectories with the same directory structure.  I need to count the 
Jeremy> number of files and directories in each subdirectory, and get a list of 
Jeremy> all unique files.

Jeremy> Here is the code fragment I have (not tested yet):

Jeremy> Is there a more effecient way to:
Jeremy> 1) Extract the unique list of files?
Jeremy> 2) Use perl to replace the find commant?

Jeremy> Thanks,

Jeremy> Jeremy

Jeremy> my $d_count=0;
Jeremy> my $f_count=0;
Jeremy> my %map;
Jeremy> opendir (ED_DIR, $bdir);
Jeremy> @subdir = { /!^\./ && -d "$bdir/$_" } readdir(DIR);
Jeremy>         foreach $d (@subdir) {
Jeremy>                 chomp $d;
Jeremy>                 my $dir = "$bdir/$d";
Jeremy>                 my @files = qx~find $bdir -type 'f' -print~;
Jeremy>                 my @dirs = qx~find $bdir -type 'd' -print~;
Jeremy>                 $d_count+=$#files+1;
Jeremy>                 $f_count+=$#dirs+1;
Jeremy>                 foreach $f (@files) {
Jeremy>                       $map{$f} = 1;
Jeremy>                 }
Jeremy>         }

If I understand you, I think this will do it:

my $d_count = 0;
my $f_count = 0;
my %unique_files;

use File::Find;
find sub {
  if (-d $_) {
  } elsif (-f _) {
    # remove prefix:
    (my $n = $File::Find::name) =~ s/^.*?\//;
    $unique_files{$n} = 1;
}, $bdir;

Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn at stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

More information about the Chicago-talk mailing list