The code below does the job in a simple way, but does not handle symbolic links, for example.
#! /usr/bin/perl use warnings; use strict; use File::Basename; use File::Copy; use File::Find; use File::Spec::Functions qw/ abs2rel catfile file_name_is_absolute rel2abs /; die "Usage: $0 src dst\n" unless @ARGV == 2; my($src,$dst) = @ARGV; $dst = rel2abs $dst unless file_name_is_absolute $dst; $dst = catfile $dst, basename $src if -d $dst; sub copy_nodots { if (/^\.\z|^[^.]/) { my $image = catfile $dst, abs2rel($File::Find::name, $src); if (-d $_) { mkdir $image or die "$0: mkdir $image: $!"; } else { copy $_ => $image or die "$0: copy $File::Find::name => $image: $!\n"; } } } find \©_nodots => $src;
source share