Скопіюйте символьне посилання ТА, де воно вказує на використання rsync


11

Це не потрібно робити rsync, але було б непогано не писати сценарій для цього, і rsyncце дуже близько до того, що я хочу.

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

Ось приклад. Скажімо, у нас є ієрархія цієї папки:

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).
Жил "ТАК - перестань бути злим"

@Gilles: Так, ти маєш рацію. Відстеження посилань може призвести до включення безлічі файлів, якщо вони все ще знаходяться всередині вихідного каталогу.
Вей-Інь

Відповіді:


2

Якщо ви знаєте ім'я символьного посилання та хочете передати посилання та ціль, ви можете:

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

Перший rsyncпередає саме symlink. Друга команда знаходить справжнє ім'я каталогу, а друга rsyncпередає вміст каталогу.


0

Це було б можливо, якби і тільки якби ви всі були в "mydir" і ви мали б rsync "mydir" з одного місця в інше. Rsync не в змозі копіювати за межами шляху, який ви йому надаєте (за винятком наступних посилань). напр

mydir/dirA ...
mydir/dirB ...
...

Так, це припущення відповідає моєму випадку використання. Всі посилання знаходяться всередині mydir.
Вей-Інь

@ Вей-Інь тоді просто скажіть, щоб не слідкувати за символічними посиланнями ... чи я щось неправильно зрозумів
xenoterracide

@xenoterracide: Незалежно від того, як ви викликаєте rsync, я думаю, що це створить єдине місце призначення для кожного джерела (крім створення провідних каталогів). Але Вей-Інь хоче створити два або більше напрямків: посилання та її ціль.
Жил "ТАК - перестань бути злим"

мабуть, я розгублений ...
xenoterracide

@Gilles: rsync не має потреби слідувати за символьним посиланням, оскільки це все одно синхронізує ціль . Тож спочатку копіюється симпосилання, роблячи звисаючу симпосилання. Потім відбувається копіювання всього іншого в каталог, включаючи ціль символьної посилання. Вуаля, все гарно вписується.
Мартін проти Левіса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.