Назад | Перейти на главную страницу

rsync заменяет существующий каталог символической ссылкой

на server1: / dir1 - это символическая ссылка на dir2

на server2: / dir1 - это каталог с собственным содержимым

Я хочу использовать rsync, чтобы сделать server2: / dir1 символической ссылкой на dir2, как и на server1.

Если я сделаю это на server1:

rsync -azvs --delete /dir1 user@server2:/dir1

то я действительно получаю новую (сломанную) символическую ссылку на server2:

/dir1/dir1 -> dir2

(поэтому он копирует символическую ссылку в существующий каталог / dir1 вместо ее замены)

Могу ли я вместо этого заставить rsync попирать существующий каталог / dir1 с помощью символической ссылки?

редактировать: Я думал, что указанная выше команда будет работать из-за этого комментария в man для rsync под --copy-dirlinks раздел:

Без этой опции, если отправляющая сторона заменила каталог символической ссылкой на каталог, принимающая сторона удалит все, что находится на пути новой символической ссылки, включая иерархию каталогов (пока --force или --delete действует).

Однако поведение выглядит одинаково с и без --force, и с и без -k.

Проблема в том, что вы указываете /dir1 как пункт назначения. Вам нужно подняться на один уровень.

rsync -azvs --delete /dir1 user@server2:/

Я не понимаю, зачем вам использовать Rsync для создания символической ссылки на том же сервере. Возможно, я неправильно понимаю ваш вопрос, но если вы хотите сделать символическую ссылку внутри server2 с источником в / dir2 и ссылку в / dir1, вам нужно просто запустить: ln -s /dir2 /dir1.

На всякий случай, как указано в другом ответе и расширении проблемы с вашей линией.

Разбираем вашу команду:

rsync -azvs --delete /dir1 user@server2:/dir1

Вы выполняете rsync, режим архива (рекурсивный, владелец, группа, включая символические ссылки как символические ссылки, среди прочего), сжатие, подробный и без разделения пространства:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -z, --compress              compress file data during the transfer
    -v, --verbose               increase verbosity
    -s, --protect-args          no space-splitting; wildcard chars only

Кроме того, вы удаляете различия в пунктах назначения:

        --delete                delete extraneous files from dest dirs

Тогда вы используете в качестве источника /dir1, что означает весь каталог, а не только его содержимое (поскольку в конце отсутствует косая черта "/").

И пункт назначения user@server2:/dir1, учитывая / dir1 была символической ссылкой, и вы использовали -a флаг для архива, вы копируете символическую ссылку внутри корня / dir1, заканчивая этим:

server2:/dir1/dir1