in reply to Re^2: Comparing files in directory
in thread Comparing files in directory

Providing there are no sub-folders, the essentials are this

#!perl use strict; use File::Find; my $old = 'c:/....'; # as reqd my $new = 'c:/....'; # as reqd my %old_list =(); my %new_list =(); find( sub { $old_list{$_} = 1}, $old); find( sub { $new_list{$_} = 1}, $new); my $diffs = DirCompare(); print "$_\n" for @$diffs; sub DirCompare { my @diffs = (); for my $file (sort keys %old_list) { if ( !defined $new_list{$file} ) { push @diffs, "Old file not in new: $file"; } } for my $file (sort keys %new_list) { if ( !defined $old_list{$file} ) { push @diffs, "New file not in old: $file"; } } return \@diffs; }
poj

Replies are listed 'Best First'.
Re^4: Comparing files in directory
by smturner1 (Sexton) on Dec 11, 2014 at 21:03 UTC

    Thank you poj.

    Just some questions....

    Below, I declare my hashs and array (within the sub DirCompare)

      my ( %old_list, %new_list, @diffs);

    Next line, I am looping through $ARCHIVE and reading files or files within folders into $file. This will continue until it reaches the top of the file list or parent directory. $file will then be passed into the hash %old_list

      for my $file ( find ( sub { %old_list { $file } = 1 }, $ARCHIVE ) );

    Next line, I am looping through $SourceDir and reading files or files within folders into $file. This will continue until it reaches the top of the file list or parent directory. $file will then be passed into the hash %new_list

      for my $file ( find ( sub { %new_list { $file } = 1 }, $SourceDir ) );

    The above statements are what I intended when I wrote the code. So my questions are, why do I need to declare the hashs and arrays when they are already declared? Does $file in the inner most brackets need to be '$_' or $file?

      find does the search for you ( don't need for my $file ) and the current filename is in $_.

      If find is within the sub, then yes you can declare your hashes there.

      see File::Find for details.
      poj

      update : $_ is the filename only, if you have the same filename in subfolders then more code is required.