in reply to Listing Files

Here is how to get a File::Find recursive list
#!/usr/bin/perl use strict; use File::Find; find (\&wanted, '.'); sub wanted { next if -d; # skip if it's a directory # $_ is the name of the file # $File::Find::name is the full path and name to the file print "$File::Find::name\n"; }
When you say compare, what do you mean? Do you want to check for exact identity? Same names? Same size? What?

Here is a way to put the listings into a hash, so you could cycle thru the hash and compare.

#!/usr/bin/perl -w use strict; use Data::Dumper; sub hashdir { my $dir = shift || '.'; opendir my $dh, $dir or die $!; my $tree = {}->{$dir} = {}; while ( my $file = readdir($dh) ) { next if $file =~ m[^\.{1,2}$]; my $path = $dir . '/' . $file; $tree->{$file} = hashdir($path), next if -d $path; push @{ $tree->{'.'} }, $file; } return $tree; } my $tree = hashdir(shift); print Dumper $tree;

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: Listing Files
by vchavan (Initiate) on Sep 16, 2011 at 10:44 UTC

    Thanks By comparison I want to compare their names. and also check if there is any zero byte file and if there is then list it out. First I need to collect all the files (recursively) from two similar directories say Dir_build1 and Dir_Build2 in say 2 arrays and then compare them by name and find out any differences. Then its directory i.e. if difference comes out in Dir_build2 then it should display that Dir_Build 2 have x y z files different than Dir_build1 Could you please help me ?

      Honestly, I'd do this with a few command-line tools, rather than Perl, but the concepts would be the same:

      find Dir_build1 Dir_build2 -type f -size 0 >/tmp/zeros find Dir_build1 -type f | sort >/tmp/1 find Dir_build2 -type f | sort >/tmp/2 comm -3 /tmp/1 /tmp/2

      To do it in Perl, I'd use File::Find to recursively scan through each directory, adding the file names to an array (probably a hash, actually) for each, then sort and compare the two. During the scans, I'd also build a list of zero-byte files, to avoid scanning through them twice, of course.

      Why don't you post what you have tried? Then we can help you fix it. This is not a code writing service and the posts above should be enough to get you started.


      -pete
      "Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."
        use strict; use warnings; use File::Find; find({ wanted => \&process_file, preprocess => \&preprocess, no_chdir +=> 1 }, @ARGV); #find({ wanted => \&process_file, no_chdir => 1 }, @ARGV); sub process_file { @List = (); if (-f $_) { print "This is a file: $_\n"; push(@List,$_); } else { print "This is not file: $_\n"; } return @List; } sub preprocess { print "pre-processing @_\n"; # never see this return sort @_; } @DIRLIST = @List; print "@DIRLIST\n";

        I am trying to return List of Files from File:Find to main Module in @DIRLIST But do not know if it is possible to return a value from wanted sub in File:Find to main sub