Backup Exclusions

snap2 has a built-in default list of wildcard patterns.  It is:

- *~
- *.log
- temp/
- tmp

This means the program does not backup files or directories ending '~' and '.log', and ignores all files in directories named temp, and all directories or files named 'tmp'.  This list is stored in the file ~/.snap2/default/exclude/default.  If you ever want to change or add to these default exclusions, click the 'Default Exclusions' button on the 'ADVANCED SETTINGS' tab. (Or of course, you could edit the file directly.)

 

The '-' starting the lines means 'exclude'.   The '**' matches any part of filenames, crossing directory boundaries (that is, including '/').  A single '*' matches any part of a filename, but stops at any '/'.  Any filename that does match any of the exclude patterns is included in the backup.  For more information on exclude patterns, see the rsync manual (http://www.samba.org/ftp/rsync/rsync.html).  For your convenience, below I have reprinted an excerpt from the man page.

INCLUDE/EXCLUDE PATTERN RULES

(from http://www.samba.org/ftp/rsync/rsync.html)

if the pattern starts with a / then it is anchored to a particular spot in the hierarchy of files, otherwise it is matched against the end of the pathname. This is similar to a leading ^ in regular expressions. Thus "/foo" would match a name of "foo" at either the "root of the transfer" (for a global rule) or in the merge-file's directory (for a per-directory rule). An unqualified "foo" would match a name of "foo" anywhere in the tree because the algorithm is applied recursively from the top down; it behaves as if each path component gets a turn at being the end of the filename. Even the unanchored "sub/foo" would match at any point in the hierarchy where a "foo" was found within a directory named "sub". See the section on ANCHORING INCLUDE/EXCLUDE PATTERNS for a full discussion of how to specify a pattern that matches at the root of the transfer.
if the pattern ends with a / then it will only match a directory, not a regular file, symlink, or device.
rsync chooses between doing a simple string match and wildcard matching by checking if the pattern contains one of these three wildcard characters: '*', '?', and '[' .
a '*' matches any path component, but it stops at slashes.
use '**' to match anything, including slashes.
a '?' matches any character except a slash (/).
a '[' introduces a character class, such as [a-z] or [[:alpha:]].
in a wildcard pattern, a backslash can be used to escape a wildcard character, but it is matched literally when no wildcards are present.
if the pattern contains a / (not counting a trailing /) or a "**", then it is matched against the full pathname, including any leading directories. If the pattern doesn't contain a / or a "**", then it is matched only against the final component of the filename. (Remember that the algorithm is applied recursively so "full filename" can actually be any portion of a path from the starting directory on down.)
a trailing "dir_name/***" will match both the directory (as if "dir_name/" had been specified) and everything in the directory (as if "dir_name/**" had been specified). This behavior was added in version 2.6.7.

Note that, when using the --recursive (-r) option (which is implied by -a), every subcomponent of every path is visited from the top down, so include/exclude patterns get applied recursively to each subcomponent's full name (e.g. to include "/foo/bar/baz" the subcomponents "/foo" and "/foo/bar" must not be excluded). The exclude patterns actually short-circuit the directory traversal stage when rsync finds the files to send. If a pattern excludes a particular parent directory, it can render a deeper include pattern ineffectual because rsync did not descend through that excluded section of the hierarchy. This is particularly important when using a trailing '*' rule. For instance, this won't work:

+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *

This fails because the parent directory "some" is excluded by the '*' rule, so rsync never visits any of the files in the "some" or "some/path" directories. One solution is to ask for all directories in the hierarchy to be included by using a single rule: "+ */" (put it somewhere before the "- *" rule), and perhaps use the --prune-empty-dirs option. Another solution is to add specific include rules for all the parent dirs that need to be visited. For instance, this set of rules works fine:

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

Here are some examples of exclude/include matching:

  • "- *.o" would exclude all names matching *.o
  • "- /foo" would exclude a file (or directory) named foo in the transfer-root directory
  • "- foo/" would exclude any directory named foo
  • "- /foo/*/bar" would exclude any file named bar which is at two levels below a directory named foo in the transfer-root directory
  • "- /foo/**/bar" would exclude any file named bar two or more levels below a directory named foo in the transfer-root directory
  • The combination of "+ */", "+ *.c", and "- *" would include all directories and C source files but nothing else (see also the --prune-empty-dirs option)
  • The combination of "+ foo/", "+ foo/bar.c", and "- *" would include only the foo directory and foo/bar.c (the foo directory must be explicitly included or it would be excluded by the "*")