
Допустим, у нас есть такой путь к нашему каталогу:
a/b/c/d/e
где c
на самом деле символическая ссылка,
a/b/c -> f
И f
содержит d/e
.
Затем, когда я запускаю rsync -avzR
, без --copy-unsafe-links
флага, он все равно копирует эту «небезопасную» ссылку.
Ожидал:
a/b/c->f
f/d/e
когда я бегу rsync -avzR a/b/c/d/e some_dir
.
Фактический результат:
a/b/c/d/e
Как таким образом можно получить ожидаемый результат?
решение1
Заman rsync
(выделено мной):
-R, --относительный
Используйте относительные пути. Это означает, что на сервер отправляются полные имена путей, указанные в командной строке, а не только последние части имен файлов. [Если] вы использовали
rsync -avR /foo/bar/baz.c remote:/tmp/
то файл с именем /tmp/foo/bar/baz.c будет создан на удаленной машине, сохраняя свой полный путь. Эти дополнительные элементы пути называются"подразумеваемые каталоги"(т. е. каталоги «foo» и «foo/bar» в приведенном выше примере).
Начиная с rsync 3.0.0,rsync всегда отправляет эти подразумеваемые каталоги как реальные каталоги в списке файлов, даже если элемент пути на самом деле является символической ссылкой на отправляющей стороне. Это предотвращает некоторые действительно неожиданные поведения при копировании полного пути файла, о наличии в пути которого вы не знали. Если вы хотите дублировать символическую ссылку на стороне сервера, включите как символическую ссылку через ее путь, так и референтный каталог через ее реальный путь. Если вы имеете дело со старым rsync на отправляющей стороне, вам может потребоваться использовать эту
--no-implied-dirs
опцию.
Поэтому поведение, которое вы испытали, было ожидаемым.
Как это обойти? Я не проверял, но думаю, что приемлемым решением будет следующее:
mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir # No trailing slash after 'f'
Я бы также рекомендовал прочитатьСИМВОЛИЧЕСКИЕ ССЫЛКИраздел rsync
страницы руководства.
решение2
Я не могу повторить ваше поведение. Я создал скрипт, который создает каталог, а затем копирует его. Внутри него есть относительная и абсолютная символическая ссылка. С параметрами, которые вы показываете ( -avzR
), он не должен спускаться ни в один из них, а копировать ссылку как ссылку.
Я предполагаю, что я неправильно истолковал какой-то аспект того, что вы пытаетесь сделать. Так что вы можете добавить к своему вопросу, если найдете, что это, или можете запустить этот скрипт и посмотреть, отличается ли ваше поведение от того, что я показываю.
Сценарий:
#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST
Выход
sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f
И место назначения создается с символическими ссылками внутри
$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f