15

I'm trying to work out the rsync filter syntax to perform complex include/excludes, and trying to achieve the following:

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*

I've tried many variations on the filter syntax, and despite reading the man page many time, I cannot get this sort of effect. Rsync filters seem to be very powerful, and I find it hard to believe they couldn't handle a common scenario such as this.

brianmathis
  • 211
  • 1
  • 2
  • 5

2 Answers2

20

You need to include all of the parent directories down to the desired directory before using the exclude rule.

For instance, I use the following in a backup script:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST

So in your case you would need something like the following:

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST
Shane Meyers
  • 1,008
  • 1
  • 7
  • 17
6

On the command line:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST

Remove --dry-run to make it functional, replace "DEST" with your destination and add user and host to the source "/" if needed.

From a rule file:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST

where the contents of /etc/rsync/somerules.rules might be:

+/ /home/user1
-/ /home/*

You should test these and you may need to make some adjustments, but this should get you started.

Dennis Williamson
  • 62,149
  • 16
  • 116
  • 151
  • OK, that works. I have a more complex case which I've added to the question. The additional include doesn't work with the subdir scenario. – brianmathis Jun 11 '10 at 16:45