Опция --exclude
занимает PATTERN
, что означает, что вы просто должны быть в состоянии сделать это:
rsync -avz --exclude='dir/to/skip/*' /my/source/path /my/backup/path
Обратите внимание, что PATTERN
заключен в кавычки, чтобы не допустить расширения оболочки над ним.
Поскольку dir/to/skip
не соответствует шаблону dir/to/skip/*
, он будет включен.
Вот пример, показывающий, что это работает:
> mkdir -p a/{1,2,3}
> find a -type d -exec touch {}/file \;
> tree --charset ascii a
a
|-- 1
| `-- file
|-- 2
| `-- file
|-- 3
| `-- file
`-- file
3 directories, 4 files
> rsync -r --exclude='/2/*' a/ b/
> tree --charset ascii b
b
|-- 1
| `-- file
|-- 2
|-- 3
| `-- file
`-- file
3 directories, 3 files
Важно отметить, что ведущий /
в приведенном выше PATTERN
представляет корень исходного каталога, , а не корень файловой системы. Это объясняется на справочной странице rsync
. Если вы опустите начальную косую черту, rsync
будет пытаться сопоставить PATTERN
с end каждого пути. Это может привести к неожиданному исключению файлов. Например, предположим, что у меня есть каталог a/3/2/
, который содержит набор файлов, которые я do хочу передать. Если я опущу ведущий /
и сделаю:
rsync -r --exclude='2/*' a/ b/
, тогда PATTERN
будет соответствовать a/2/*
и a/3/2/*
, что не то, что я хотел.