Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

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]
[Discipulus]: imperial infiltration
[marto]: Corion none of it is live, all recordings, in the first instance they need to transfer video from dead/dying media (DVDR, VHS, Laserdisc and so on)
[marto]: Discipulus, yeah pretty much robots going around parts of the plant humans can't

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2017-07-28 09:43 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (425 votes). Check out past polls.