Rsync: исключить содержимое каталога, но включить каталог - PullRequest
0 голосов
/ 17 апреля 2019

Я знаю, что каталог можно исключить с помощью --exclude, например:

rsync -avz --exclude=dir/to/skip /my/source/path /my/backup/path

Это пропустит каталог dir/to/skip

Однако я хочу скопировать сам каталог, но не его содержимое | Есть ли одна строка с rsync для этого?

По существу, включает dir/to/skip, но исключает dir/to/skip/*

ПРИМЕЧАНИЕ: я искал этот вопрос. Я нашел много подобных сообщений, но не совсем это. Извиняюсь, если уже есть дупе.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Опция --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/*, что не то, что я хотел.

1 голос
/ 17 апреля 2019

Попробуйте:

rsync -avz --include=src/dir/to/skip --exclude=src/dir/to/skip/* src_dir dest_dir

--include=src/dir/to/skip включает каталог. --exclude=src/dir/to/skip/* исключает все в каталоге.

...