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.

2 Answers 2

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
2
  • Excellent. Took me some time.
    – yclian
    Feb 12, 2011 at 16:00
  • Somehow, when I read the man rsync, I misunderstood the proper order of mixing includes and excludes. It took me an hour to figure it out... Jul 22, 2016 at 18:57
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.

1
  • 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. Jun 11, 2010 at 16:45

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .