Скопируйте символическую ссылку И куда она указывает на использование rsync

11

Это не должно быть сделано rsync, но было бы неплохо написать сценарий для этого, и rsyncэто очень близко к тому, что я хочу.

rsync -a(или -l) может сохранять символические ссылки и -Lможет разыменовывать символические ссылки и копировать их, как если бы это был обычный файл / каталог. Однако возможно ли сохранить символическую ссылку, а также скопировать файлы / каталоги, на которые указывает ссылка?

Вот пример. Скажем, у нас есть эта иерархия папок:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

и когда я делаю rsync -aR dirA dest(или что-то еще), я хотел бы, чтобы именно это появилось в dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Это возможно с rsync? Спасибо.

Давайте предположим, что символические ссылки, имеющие абсолютный путь или указывающие на внешний каталог, могут быть проигнорированы.

Вэй-Инь
источник
1
Я думаю, что ваш запрос недостаточно конкретен: вы требуете, чтобы, если dirA/linkесть символическая ссылка на ../dirB/file, то это обрабатывалось как копирование dirB/fileв dest/dirB/fileи dirA/linkв dest/dirA/link. Что делать, если dirA/linkссылка на ../../another_file? Что происходит в общем случае, если dirA/linkуказывает на каталог, который находится выше в дереве каталогов?
Риккардо Мурри
Хороший улов. В моем случае использования нет ссылки на внешнюю сторону дерева и нет абсолютного пути в ссылках.
Вэй-Инь
1
Чем больше я думаю об этом, тем больше я думаю, что ни одна стандартная утилита не сделает этого. В общем случае, возможно , потребуется создать большое количество направлений данных одного источника, если у вас есть символическая ссылка на линк или в более общий смысле символической ссылки, целью которого содержит символьную ссылку (например a -> b, b -> c/foo, c -> d/e: запрос на копию aдолжна также скопировать b, c, c/foo, d, d/eи d/e/foo).
Жиль "ТАК - перестать быть злым"
@ Жиль: Да, вы правы. Отслеживание ссылок может привести к включению большого количества файлов, если они все еще находятся внутри исходного каталога.
Вэй-Инь

Ответы:

2

Если вы знаете имя символической ссылки и хотите передать ссылку и цель, вы можете:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Первая rsyncпередача всего symlink. Вторая команда находит реальное имя каталога, а вторая rsyncпередает содержимое каталога.

user201564
источник
0

Это было бы возможно, если и только если бы вы все были в «mydir», и вы должны были «rysync» mydir из одного места в другое. Rsync не может копировать вне указанного вами пути (за исключением следующих ссылок). например

mydir/dirA ...
mydir/dirB ...
...
xenoterracide
источник
Да, это предположение соответствует моему варианту использования. Все ссылки находятся внутри mydir.
Вэй-Инь
@ Вей-Инь тогда просто скажи ему не следовать символическим ссылкам ... или я что-то не так понял
xenoterracide 14.10.10
@xenoterracide: Независимо от того, как вы вызываете rsync, я думаю, что он создаст единый пункт назначения для каждого источника (кроме создания ведущих каталогов). Но Вэй-Инь хочет создать два или более пунктов назначения: ссылку и ее цель.
Жиль "ТАК - перестать быть злым"
видимо я в замешательстве ...
ксенотеррацид
@Gilles: rsync не нужно следовать по символической ссылке, так как он все равно будет синхронизировать цель . Таким образом, он сначала копирует символическую ссылку, создавая висячую символическую ссылку. Затем он продолжает копировать все остальное в каталоге, включая цель символической ссылки. Вуаля, все прекрасно сочетается.
Мартин против Лёвиса