There are non-Perl tools to do things like this, rsync for one-way and unison for two-way synchronization.
If you want to do it with Perl, File::Copy and the file test operators together with File::Find should do the trick. | [reply] |
Thanks. I have to do this recursively hence looking for a perl function.
I found File::Xcopy
update|UD - copy files only if
1) the file exists in the target and
2) newer in time stamp
http://search.cpan.org/~geotiger/File-Xcopy-0.12/Xcopy.pm#xmove($from,_$to,_$pat,_$par)
| [reply] |
I'm not familiar with unison, but it probably can use recursion. I know rsync definitely does. Use Perl if you want, but it's not the only language that allows utilities to be written that recur through directories. Several utilities already exist which do that.
| [reply] |
#!/usr/bin/perl -w
use strict;
${^WIN32_SLOPPY_STAT}++; # Speed up the 'stat' call on Windows
if ((stat "/tmp/A")[9] > (stat "/tmp/B")[9]){ # Compare mtime stamps
print "A is newer than B; discarding B.\n";
unlink "B" or die "B: $!\n";
}
else {
print "B is newer than A; replacing A.\n";
unlink "A" or die "A: $!\n";
rename "B", "A" or die "Copying B->A: $!\n";
}
--
"Language shapes the way we think, and determines what we can think about."
-- B. L. Whorf
| [reply] [d/l] |
On a system that has GNU mv (and perhaps other implementation of mv have the -u option as well), I'd do:
system mv => '-u', "B/ABC.txt", "A/ABC.txt" and die;
Perl, after all, is a glue language, and there's nothing wrong with reusing code.
Luckely, GNU fileutilities (which includes mv) have been ported to almost any platform Perl runs on (and then some). | [reply] [d/l] |
That's a good solution. I was going to mention GNU cp. I'll do it here to keep mv and cp together in the suggestions.
I'd like to point out to the OP that both support the -u option for copying or moving only updated files. So one can keep the original copy of the newer file with one or move it with the other depending on changing needs, and it's still the same option to trigger the same semantics of only acting if the source file is newer than the destination.
GNU cp also can work recursively with the -r (or -R) option. With both (-u -r ) it can recursively copy directories and only overwrite an existing file if the source file is newer than the destination file or if the destination file doesn't already exist.
| [reply] [d/l] [select] |
Hi will this GNU mv work in Windows systems too? Do i need to install anything. I have activestate perl in a windows machine.
| [reply] |
Hi will this GNU mv work in Windows systems too?
Couldn't spot a GNU mv.exe at http://gnuwin32.sourceforge.net/packages.html, though there could well be an mv.exe in one of those packages.
Both Cygwin and MSYS do provide an mv.exe for Windows.
Cheers, Rob
| [reply] |