As mentioned earlier, global include/exclude patterns are
anchored at the "root of the transfer" (as opposed to per-
directory patterns, which are anchored at the merge-file's
directory). If you think of the transfer as a subtree of names
that are being sent from sender to receiver, the transfer-root is
where the tree starts to be duplicated in the destination
directory. This root governs where patterns that start with a /
match.
Because the matching is relative to the transfer-root, changing
the trailing slash on a source path or changing your use of the
--relative
option affects the path you need to use in your
matching (in addition to changing how much of the file tree is
duplicated on the destination host). The following examples
demonstrate this.
Let's say that we want to match two source files, one with an
absolute path of "/home/me/foo/bar", and one with a path of
"/home/you/bar/baz". Here is how the various command choices
differ for a 2-source transfer:
Example cmd: rsync -a /home/me /home/you /dest
+/- pattern: /me/foo/bar
+/- pattern: /you/bar/baz
Target file: /dest/me/foo/bar
Target file: /dest/you/bar/baz
Example cmd: rsync -a /home/me/ /home/you/ /dest
+/- pattern: /foo/bar (note missing "me")
+/- pattern: /bar/baz (note missing "you")
Target file: /dest/foo/bar
Target file: /dest/bar/baz
Example cmd: rsync -a --relative /home/me/ /home/you /dest
+/- pattern: /home/me/foo/bar (note full path)
+/- pattern: /home/you/bar/baz (ditto)
Target file: /dest/home/me/foo/bar
Target file: /dest/home/you/bar/baz
Example cmd: cd /home; rsync -a --relative me/foo you/ /dest
+/- pattern: /me/foo/bar (starts at specified path)
+/- pattern: /you/bar/baz (ditto)
Target file: /dest/me/foo/bar
Target file: /dest/you/bar/baz
The easiest way to see what name you should filter is to just
look at the output when using --verbose
and put a / in front of
the name (use the --dry-run
option if you're not yet ready to
copy any files).