Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Comparedirs.pl

by rob_au (Abbot)
on Feb 13, 2002 at 10:09 UTC ( [id://145120]=note: print w/replies, xml ) Need Help??


in reply to Comparedirs.pl

A couple of comments on your code ...

The readdir function iterates through each directory entry opened by opendir - Your code doesn't test whether the returned entry is either a file or directory and fails to iterate through any sub-directories present within the test directories. While not a problem per se, it does mean that great differences can exist between directories without being reported by your script.

Another issue lies with the order of code when calling stat on the returned directory entry, specifically the following code segment:

$values1 = stat($currentFile2) or warn "can't stat the file: $!\n"; $hashDir2{$currentFileCD} = { size =>$values1->size, mtime =>$values1->mtime, };

While a warning is generated when the file stat fails, your code continues through and still assigns return values from the failed stat to the directory hash. An alternate (more defensive) way to write this code would be:

if ( my $values = stat($currentFile2) ) { $hashDir2{ $currentFileCD } = { size => $values->size, mtime => $values->mtime } } else { warn "can't stat the file: $!\n" }

If you want to build a more robust file comparison tool that incorporates directory checking, you may want to look at the source to File::Find::Duplicates which builds an intermediate array of stat values for files found through File::Find.

On a much smaller and less significant note ... "This script will compare the same directory on two different machines for content, size and mtime" ... Where is the code comparing file content?

:-)

 

perl -e 's&&rob@cowsnet.com.au&&&split/[@.]/&&s&.com.&_&&&print'

Replies are listed 'Best First'.
Re: Re: Comparedirs.pl
by Rich36 (Chaplain) on Feb 13, 2002 at 13:46 UTC
    Also to add just a small comment, at the beginning of the code you redeclare the variables $hashDir1 and $hashDir2. Running under 5.6 with the -w flag, I got the errors.
    "my" variable %hashDir1 masks earlier declaration in same scope at tes +t.pl line xx. "my" variable %hashDir2 masks earlier declaration in same scope at tes +t.pl line xx.

    Rich36
    There's more than one way to screw it up...

Re: Re: Comparedirs.pl
by RayRay459 (Pilgrim) on Feb 13, 2002 at 21:32 UTC
    Thank you very much for your advice. It is very much appreciated. The reason i posted my code was to make it better and learn. I will make the change by adding the if statement, when stat'ing the file, to get rid of return values of the failed stat. The code was ment to compare directory content, not file content. if it matched in size and modtime, thats all i was looking for. do you think thats wrong. please let me know.
    thanks again
    Ray
      Please don't get me wrong at all Ray - My comments were intended to give you feedback and encourage you on the code, not discourage you at all. If the program does what you want it to do and you are happy with it, ignore everyone else and be happy that you were able to solve a problem with your knowledge of Perl.

      Good luck! :-)

       

      perl -e 's&&rob@cowsnet.com.au&&&split/[@.]/&&s&.com.&_&&&print'

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://145120]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-19 17:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found