LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Networking (http://www.linuxquestions.org/questions/linux-networking-3/)
-   -   rsync - sync files modified within the last 60 days (http://www.linuxquestions.org/questions/linux-networking-3/rsync-sync-files-modified-within-the-last-60-days-730334/)

boomklever 06-03-2009 02:45 AM

rsync - sync files modified within the last 60 days
 
Hi

Can anybody tell me how I can synchronise files between two computers in a network that have been modified or created within the last 60 days?

Thanks in advance! :-)

billymayday 06-03-2009 02:54 AM

something like

find /path -file -mtime -60 -exec rsync {} destination \;

boomklever 06-03-2009 03:13 AM

Thanks, I haven't thought of find. That helps. :-)

boomklever 06-03-2009 09:41 AM

Maybe the way I went to work on the problem is more complicated than it needs to be. Anyway, I worked around it with an extra step, that is done by a perl script I wrote for the purpose. The script, with the help of find, copies all files from a source directory to a destination directory if they're older than a specified amount of days.

Maybe it will come in handy for somebody else, so I post it here:
Code:

#!/usr/bin/perl

use strict;
use warnings;
use File::Path;
use File::Basename;
use File::Spec;
use File::Copy;
use Cwd;
use Getopt::Long;

# make output unbuffered
$| = 1;

my $path    = getcwd;
my $mtime    = 1;
my $dest;
my $verbose  = '';
my $showhelp = '';
my $result  = GetOptions("source=s"  => \$path,
                          "mtime=i"  => \$mtime,
                          "dest=s"    => \$dest,
                          "help"      => \$showhelp,
                          "verbose"  => \$verbose);

# DEBUG
# print "\$path = $path\n\$mtime = $mtime\n\$dest = $dest\n\$showhelp = $showhelp\n\$verbose = $verbose\n";
# exit(0);

my $usage = "Usage: $0 --dest <destination-path>\n\t" .
            "[--source <source-path> | --mtime <mtime> | --verbose] [--help]\n\t" .
            "Type $0 --help for more information.";
my $help = <<EOHELP;
$0 - Copy file hierarchies selectively
    based on their modification times

Options:
    -s | --source=SourceDir    Source path. Default: pwd
    -m | --mtime                mtime (see man find). Default: 1
    -d | --dest=DestDir        Destination path. Mandatory option.
    -h | --help                Print this help screen.
    -v | --verbose              Be more verbose. Default: false
EOHELP

if ($showhelp) {
    print $help;
    exit(0);
}
unless ($dest) {
    die "$usage\n";
}

# remove trailing slash from $dest
$dest =~ s/\/$//;
my $find = "find $path -type f -mtime -$mtime";

my @files = `$find`;
my %dirs_created;
foreach (@files) {
    # debug
    print;
    chomp;
    s/^\.\///;

    my ($filename, $directories, $suffix) = fileparse($_);
    my $new_dir = File::Spec->canonpath(File::Spec->catdir($dest, $directories));
    unless (exists $dirs_created{$new_dir}) {
            $dirs_created{$new_dir} = mkpath($new_dir);
            print "Created $new_dir\n" if $verbose;
    }
   
    copy($_, File::Spec->catfile($new_dir, "$filename$suffix"));
    print File::Spec->catfile($new_dir, "$filename$suffix") . "\n" if $verbose;
}

exit(0);



All times are GMT -5. The time now is 06:05 PM.