Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Re: copy a directory

by tfrayner (Curate)
on May 15, 2002 at 11:27 UTC ( #166688=note: print w/replies, xml ) Need Help??

in reply to copy a direcory


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,

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.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (4)
As of 2020-10-22 21:56 GMT
Find Nodes?
    Voting Booth?
    My favourite web site is:

    Results (230 votes). Check out past polls.