Automate Syncing Remote Folders?

This is the script I use for backing up a remove volume to another remote volume.

Since there is an rsync in this script, use with extreme caution.

#!/usr/bin/perl

use lib $ENV{HOME}."/perl";

use warnings;
use strict;
use diagnostics;

my $source = '/Volumes/XDrive';
my $dest = '/Volumes/Shared/XDriveCopy';

system( 'open', '-g', 'afp://wombat.synology.me/XDrive' );
system( 'open', '-g', 'afp://NAS._afpovertcp._tcp.local/Shared' );

{
	alarm 20;
	local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
	while ( ! -d $source || ! -d $dest || count_dir( $source ) < 5 || count_dir( $dest ) < 5 ) { ; }
	alarm 0;
}

System( 'rsync', 
	'--verbose', '--itemize-changes', '--progress', 
	'--recursive', '--times', '--links', 
	'--delete', 
	'--modify-window=2', 
	'--backup', "--backup-dir=$dest/#backups", 
	'--exclude=#recycle', '--exclude=#backups', '--exclude=.*', '--exclude=Icon?', 
	"$source/", $dest
	);

#	, '--dry-run'

sub System {
	print join( ' ',  @_ ), "\n";
	system( @_ );
}

sub count_dir {
  my( $dir ) = @_;

  my $count = 0;
  opendir( DIR, $dir ) or die "cant open dir $dir $!";
  foreach ( readdir( DIR ) ) {
        s!.*/!!;
        next if m!^\.!;
        next if $_ eq "Icon\015";
        $count++;
  }
#   print STDERR "count_dir $dir -> $count\n";
  
  return $count;
}

1 Like