#!/usr/bin/env perl use 5.010001; use strict; use warnings; use File::Rsync; use DateTime; use DateTime::Duration; use DateTime::Format::Strptime; use Getopt::Long; my $rsync_src; my $rsync_dst; my $age; GetOptions ("source=s" => \$rsync_src, "destination=s" => \$rsync_dst, "age=i" => \$age) or die("Error. Wrong arguments!\n"); my $now = DateTime->now(); my $cutoff_timestamp = $now - DateTime::Duration->new(days => $age); my $parser = DateTime::Format::Strptime->new( pattern => '%Y/%m/%d %H:%M:%S', time_zone => 'UTC', on_error => 'croak', ); my $rsync = File::Rsync->new(archive => 1); my @files = grep { $_->{timestamp} > $cutoff_timestamp } map { my @parts = split(/\s+/, $_); { name => $parts[4], timestamp => $parser->parse_datetime($parts[2] . ' ' . $parts[3]), } } $rsync->list(src => $rsync_src); #use DDP; p @files; $rsync->exec( src => $rsync_src, dst => $rsync_dst, include => [map { $_->{name} } @files], exclude => ['*'], ) or warn "rsync failed\n";