use strict; use File::Copy; use File::Find; use File::Compare; my $source="G:\\contingency\\"; my $dest="D:\\"; (-r $source) || die "Error: $source not readable\n"; (-e $dest) || die "Error: $dest (memory stick) does not exist--is your memory stick attached?\n"; # for the convenience of &wanted calls, including -eval statements: use vars qw/*name *dir *prune/; *name = *File::Find::name; *dir = *File::Find::dir; *prune = *File::Find::prune; sub wanted{}; sub wanted2{}; my $newdirs; my $newfiles; my $changedfiles; my $unchangedfiles; my $orphans; #Freshen up memory stick my $status1=find(\&wanted,$source); #..and then take care of orphans my $status1=finddepth(\&wanted2,$dest); my $totalfiles=$newdirs+$newfiles+$changedfiles+$unchangedfiles+$orphans; print "Summary report: \n"; print "$totalfiles scanned.\n"; print "$newdirs new directories found and created.\n"; print "$newfiles new files found and copied.\n"; print "$changedfiles updated files copied.\n"; print "$unchangedfiles unchanged files ignored.\n"; print "$orphans orphans deleted from memory stick.\n"; sub wanted{ $dest=$name; $dest =~ s/G:/D:/; #sleep 3; if (-d $name){ print "$name\n"; if ( not -e $dest){ print "Making directory $dest: \n"; mkdir $dest; ++$newdirs; } } else{ print "comparing $name to: \n$dest\n....\n"; my $status=compare($name, $dest); #print "status of compare is $status.\n"; unless (!$status){ print "copying $name to memory stick \n($dest)\n......\n"; my $cstatus=copy($name, $dest); #print "status of copy is $cstatus.\n"; #copy returns 1 on success ($cstatus) || die "Copy failed with status $cstatus: $!\n"; if ($status==-1){ print "File is new on contingency site since last update.\n(compare returned $status: $!\n"; ++$newfiles; }else{ print "Version of file on memory stick was different(stale or altered).\n"; ++$changedfiles; } }else{ print "files are identical.\n"; ++$unchangedfiles; } } } sub wanted2{ my $status=1; $source=$name; $source =~ s/D:/G:/; if ( not -e $source){ ++$orphans; print "$name is an orphan"; if (-d $name){ $status=rmdir $name; }else{ $status=unlink $name; } #rmidr returns true on success; unlink returns number of files deleted (should be 1) ($status) || warn "WARNING: Status of removal of $name is $status : $!\n"; } }