rsync с символической ссылкой на путь

rsync с символической ссылкой на путь

Допустим, у нас есть такой путь к нашему каталогу:

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

Связанный контент