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.

8

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.

0
6

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.

5
  • 2
    You could use a script which uses a regex to create this file before running the rsync
    – Rory Alsop
    Oct 5 '11 at 15:57
  • Could you give an example as an answer?
    – cwd
    Oct 5 '11 at 18:27
  • just updated to include an example, including what @RoryAlsop suggested combined with what thiton suggested below. Oct 5 '11 at 19:40
  • @TimKennedy In the file containing excludes, does rsync understand line-changes or space is enough?
    – Abhinav
    Jun 29 '18 at 19:59
  • @Abhinav rsync understands one entry per line. spaces will not work. Jun 30 '18 at 18:04
3

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/
1
  • 2
    Haa the power of the shell :) Apr 5 '16 at 10:28
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.

-1

Use this command:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/
1
  • That excludes InnoDB files -- not numeric directories. Jul 13 '18 at 13:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.