|  | #!/usr/local/bin/perl | 
|  |  | 
|  | use strict; | 
|  |  | 
|  | use Fcntl; | 
|  |  | 
|  | # copy-if-different.pl | 
|  |  | 
|  | # Copy to the destination if the source is not the same as it. | 
|  |  | 
|  | my @filelist; | 
|  |  | 
|  | foreach my $arg (@ARGV) { | 
|  | $arg =~ s|\\|/|g;	# compensate for bug/feature in cygwin glob... | 
|  | foreach (glob $arg) | 
|  | { | 
|  | push @filelist, $_; | 
|  | } | 
|  | } | 
|  |  | 
|  | my $fnum = @filelist; | 
|  |  | 
|  | if ($fnum <= 1) | 
|  | { | 
|  | die "Need at least two filenames"; | 
|  | } | 
|  |  | 
|  | my $dest = pop @filelist; | 
|  |  | 
|  | if ($fnum > 2 && ! -d $dest) | 
|  | { | 
|  | die "Destination must be a directory"; | 
|  | } | 
|  |  | 
|  | foreach (@filelist) | 
|  | { | 
|  | my $dfile; | 
|  | if (-d $dest) | 
|  | { | 
|  | $dfile = $_; | 
|  | $dfile =~ s|^.*[/\\]([^/\\]*)$|$1|; | 
|  | $dfile = "$dest/$dfile"; | 
|  | } | 
|  | else | 
|  | { | 
|  | $dfile = $dest; | 
|  | } | 
|  |  | 
|  | my $buf; | 
|  | if (-f $dfile) | 
|  | { | 
|  | sysopen(IN, $_, O_RDONLY|O_BINARY) || die "Can't Open $_"; | 
|  | sysopen(OUT, $dfile, O_RDONLY|O_BINARY) | 
|  | || die "Can't Open $dfile"; | 
|  | while (sysread IN, $buf, 10240) | 
|  | { | 
|  | my $b2; | 
|  | goto copy if !sysread(OUT, $b2, 10240) || $buf ne $b2; | 
|  | } | 
|  | goto copy if sysread(OUT, $buf, 1); | 
|  | close(IN); | 
|  | close(OUT); | 
|  | print "NOT copying: $_ to $dfile\n"; | 
|  | next; | 
|  | } | 
|  | copy: | 
|  | sysopen(IN, $_, O_RDONLY|O_BINARY) || die "Can't Open $_"; | 
|  | sysopen(OUT, $dfile, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY) | 
|  | || die "Can't Open $dfile"; | 
|  | while (sysread IN, $buf, 10240) | 
|  | { | 
|  | syswrite(OUT, $buf, length($buf)); | 
|  | } | 
|  | close(IN); | 
|  | close(OUT); | 
|  | print "Copying: $_ to $dfile\n"; | 
|  | } | 
|  |  |