How to exclude numeric directories with rsync?

You can't say “a name that contains only digits” in rsync's pattern syntax. So include all names that contain a non-digit and exclude the rest.

rsync --include='*[!0-9]*' --exclude='*/' …

See also my rsync pattern guide.


rsync's exclude option doesn't really support regex, it's more of a shell globbing pattern matching.

If those directories are fairly static, you should just list them in a file and use --exclude-from=/full/path/to/file/exclude_directories.txt.

Updated to provide example

First, you just put the directories into a file:

find . -type d -regex '.*/[0-9]*$' -print > /tmp/rsync-dir-exlcusions.txt

or

( cat <<EOT
123414
42344523
345343
2323
EOT ) > /tmp/rsync-directory-exclusions.txt

then you can do your rsync work:

rsync -avHp --exclude-from=/tmp/rsync-directory-exclusions.txt /path/to/source/ /path/to/dest/

You just need an extra step to set up the text file that contains the directories to exclude, 1 per line.

Keep in mind that the path of the directories in the job, is their relative path to how rsync sees the directory.


You can do it in one line:

rsync -avHp --exclude-from=<(cd /path/to/source; find . -type d -regex './[0-9]*' | sed -e 's|./||') /path/to/source/ /path/to/dest/