How to exclude directories from source with --relative

Wayne Davison wayned at
Fri May 30 18:14:22 GMT 2008

On Tue, May 27, 2008 at 10:43:00AM -0700, Stuart Anderson wrote:
> Nuts. I was afraid that was going to be the answer. Unfortunately,
> it violates the very helpful advise given above, i.e., run with "-v"
> and add exclude rules for files you don't want to transfer based
> on the output seen.

That rule is not violated (the matching is correct), it is just that you
can't try to exclude something in the middle of a relative path that
you've specified.

You can work around the issue by moving higher in the directory
structure and using includes/excludes.  For example, instead of:

rsync -avR --exclude a/ /tmp/source/./[a-z]/* /tmp/destination                                                       

You'd change the copy to be:

rsync -av --exclude-from=file /tmp/source/ /tmp/destination/

and have an exclude file:

# First, we don't want that "a" dir (anchor it with a leading slash).
- /a/
# Next, this is our matching rule from the path above.
+ /[a-z]/
# Then, exclude everything else _in_this_dir_ (note leading slash).
- /*
# Finally, I added this rule to emulate the '*' above for a shell
# that omits dot files from its globbing.
- /*/.*

If you have any questions (such as how to adapt your real copy command),
let us know.


More information about the rsync mailing list