1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#!/usr/bin/perl -w
use strict;
use File::Copy;
sub syntax()
{
print "copyexcept [-x exception-file] <src> <dest>\n";
print " -x: file containing list of files not to copy\n";
print " -v: verbose\n";
print " --help: this message\n";
}
sub copy_recursive($$$$);
sub copy_recursive($$$$)
{
my ($excepts, $src, $dest, $verbose) = @_;
if (defined $excepts->{$src}) {
print "skipping $src\n" if ( $verbose );
return;
}
if (-d $src) {
print "mkdir -p $dest\n" if ( $verbose );
system("mkdir -p $dest") == 0 || die "Failed to mkdir -p $dest: $!";
my $dir;
opendir ($dir, $src) || die "Can't open dir $src: $!";
my @entries;
while (my $name = readdir ($dir)) {
$name =~ /^\./ && next;
$name =~ /^\s*$/ && next;
copy_recursive ($excepts, "$src/$name", "$dest/$name", $verbose);
}
closedir ($dir);
} elsif (-f $src) {
print "syscopy $src -> $dest\n" if ( $verbose );
File::Copy::copy ($src, $dest) || die "Failed to copy $src -> $dest: $!";
my $perm = (stat $src)[2];
chmod ($perm, $dest);
} else {
print "skipping link $src\n" if ( $verbose );
}
}
# main ...
my (@src, $dest, $except, $verbose);
while (my $arg = shift @ARGV) {
if ($arg eq '-h' || $arg eq '--help') {
syntax();
exit 0;
} elsif ($arg eq '-x') {
$except = shift @ARGV;
} elsif ($arg eq '-v') {
$verbose = 1;
} else {
push @src, $arg;
}
}
$dest = pop @src;
@src && defined $dest || die "Missing src or dest\n";
system("mkdir -p $dest") == 0 || die "Failed to mkdir -p $dest: $!";
my $ef;
my %exceptions;
if ( defined $except && $except ne '' ) {
open ($ef, $except) || die "Can't open $except: $!";
while (<$ef>) {
chomp;
# pre-process ?
$exceptions{$_} = '1';
}
close ($ef);
}
for my $s (@src) {
my $suffix = $s;
$suffix =~ s|^.*/||g;
print "Copy $s -> $dest/$suffix\n" if ( $verbose );
copy_recursive (\%exceptions, $s, "$dest/$suffix", $verbose);
}
|