Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

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

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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://166688]
help
Chatterbox?
[shmem]: LanX: oh... now I have to figure out if this is good or bad news.
LanX bad day monks ?
[LanX]: hope you find sleep
[shmem]: LanX: which one?
[LanX]: the last
Discipulus yes a very bad day
[shmem]: grandola, vila morena
[shmem]: LanX: ah, that one. You'll get the bug reports also :P
[Discipulus]: upvote me! i'll make pm great again! ;=)
[shmem]: Discipulus reminds me of an irish saying: "I would guess a tomorrow can wait 'til this day is done" :-)

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2017-04-29 22:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I'm a fool:











    Results (534 votes). Check out past polls.