copy-if-different.pl revision 325337
1#!/usr/local/bin/perl
2
3use strict;
4
5use Fcntl;
6
7# copy-if-different.pl
8
9# Copy to the destination if the source is not the same as it.
10
11my @filelist;
12
13foreach my $arg (@ARGV) {
14	$arg =~ s|\\|/|g;	# compensate for bug/feature in cygwin glob...
15	foreach (glob qq("$arg"))
16		{
17		push @filelist, $_;
18		}
19}
20
21my $fnum = @filelist;
22
23if ($fnum <= 1)
24	{
25	die "Need at least two filenames";
26	}
27
28my $dest = pop @filelist;
29
30if ($fnum > 2 && ! -d $dest)
31	{
32	die "Destination must be a directory";
33	}
34
35foreach (@filelist)
36	{
37        my $dfile;
38	if (-d $dest)
39		{
40		$dfile = $_;
41		$dfile =~ s|^.*[/\\]([^/\\]*)$|$1|;
42		$dfile = "$dest/$dfile";
43		}
44	else
45		{
46		$dfile = $dest;
47		}
48
49	my $buf;
50	if (-f $dfile)
51		{
52		sysopen(IN, $_, O_RDONLY|O_BINARY) || die "Can't Open $_";
53		sysopen(OUT, $dfile, O_RDONLY|O_BINARY)
54		  || die "Can't Open $dfile";
55		while (sysread IN, $buf, 10240)
56			{
57			my $b2;
58			goto copy if !sysread(OUT, $b2, 10240) || $buf ne $b2;
59			}
60		goto copy if sysread(OUT, $buf, 1);
61		close(IN);
62		close(OUT);
63		print "NOT copying: $_ to $dfile\n";
64		next;
65		}
66      copy:
67	sysopen(IN, $_, O_RDONLY|O_BINARY) || die "Can't Open $_";
68	sysopen(OUT, $dfile, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY)
69					|| die "Can't Open $dfile";
70	while (sysread IN, $buf, 10240)
71		{
72		syswrite(OUT, $buf, length($buf));
73		}
74	close(IN);
75	close(OUT);
76	print "Copying: $_ to $dfile\n";
77	}
78
79