Hi,
Here's how I might do it (if I understand you correctly):
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
use File::Find;
use File::Spec;
my $source="your_source_dir";
my $dest="your_destination_dir";
my $abs_source=File::Spec->rel2abs($source);
my $abs_dest=File::Spec->rel2abs($dest);
print("Source directory: $abs_source\n".
"Destination directory: $abs_dest\n");
sub fileprocess{
print("Processing file: $_ ($File::Find::name)\n");
my $rel_file=File::Spec->abs2rel($File::Find::name, $abs_source);
my $dest_file=File::Spec->rel2abs($rel_file, $abs_dest);
if (-d $_){ # deal with directories as special case
mkdir $dest_file or die("$!\n");
}else{ # copy the files
copy($File::Find::name, $dest_file) or die("$!\n");
# change the permissions to those of the source
my $mode=(stat($File::Find::name))[2];
chmod($mode, $dest_file) or die("$!\n");
}
}
sub postprocess{
my $rel_dir=File::Spec->abs2rel($File::Find::dir, $abs_source);
my $dest_dir=File::Spec->rel2abs($rel_dir, $abs_dest);
# change the permissions to those of the source
my $mode=(stat($File::Find::dir))[2];
chmod($mode, $dest_dir) or die("$!\n");
}
find ({wanted => \&fileprocess,
postprocess => \&postprocess}, $abs_source);
Hopefully this should also be moderately portable.
Update:Bug fix - the original code would fail to process files in a given directory if the user did not have write permission for that directory (which is what you want to do...duh, silly me). Fixed using the 'postprocess' feature of File::Find to adjust directory permissions after processing the files in that directory.
Good luck,
Tim
Update2: I just noticed that the perlmonks documentation on File::Find appears to be incomplete. Check out your local 'perldoc File::Find' or go here.