9

I know rsync has an --exclude option which I use quite frequently. But how can I specify that it should exclude all "numeric" directories?

In the directory listing below I would like to only have it copy css,html,and include

.
..
123414
42344523
345343
2323
css
html
include

Normally my syntax is something like

rsync -avz /local/path/ user@server:/remote/path/ --exclude="cache"

I think it should look something like --exclude="[0-9]*" but I don't think that will work.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
cwd
  • 44,479
  • 71
  • 146
  • 167

5 Answers5

10

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.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
7

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.

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
Tim Kennedy
  • 19,369
  • 4
  • 38
  • 58
4

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/
k.parnell
  • 296
  • 1
  • 5
1

Use find to make a list of the directories to be excluded, then use rsync's --exclude-from option as Tim Kennedy described it.

thiton
  • 2,262
  • 14
  • 9
-1

Use this command:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/
perror
  • 3,171
  • 7
  • 33
  • 45