Як я можу використовувати rsync для дублювання дерева каталогів, створюючи жорсткі посилання на файли?


23

Час від часу мені доводиться проводити кілька великих змін міграції у файлах даних на моєму сервері, і я шукаю хороший спосіб це зробити. Я думав про використання rsync для дублювання структури мого каталогу, починаючи з папки кореневих даних, створюючи жорсткі посилання на всі оригінальні файли (деякі з них досить великі), і я можу перезаписати в дерево призначення лише ті файли, які потребують міграції. Зрештою, я можу сміливо переходити зі старих файлів на нові файли за допомогою двох mvоперацій.

Однак, я не можу отримати rsync для цього. я намагався

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

але замість створення жорстких посилань на файли, rsync копіює їх повністю. Чи є проблема із використанням одного і того ж джерела та каталогу призначення посилання?

Відповіді:


21

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

Якщо $DATAце абсолютний шлях (тобто він починається з а /), то правильний командний рядок, який потрібно використовувати:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[Тепер, лише короткий огляд про rsyncдивацтва Росії. Зверніть увагу на контур, /доданий до аргументу джерела. Це говорить rsyncпро роботу зі вмістом вихідного каталогу, а не з самим вихідним каталогом. (Я припускаю, що $DATAвін ще не містить трейлінгу /.) У цьому випадку ми хочемо працювати зі вмістом, тому додаємо трейлінг /.]

Якщо, з іншого боку, $DATAвідносний шлях (тобто він не починається з а /), тоді коментар Шона Р --link-destпробурхається: Шлях- цільовий шлях інтерпретується відносно шляху призначення , тож ви використовуєте наступне:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

EDIT

Останнє зауваження, виявляється, що другий rsyncкомандний рядок, який я дав, повинен працювати незалежно від того $DATA, абсолютний шлях, оскільки basenameне важливо, чи шлях є абсолютним чи відносним.


1
Просто відсутня коса риса, яка б подумала про це ... Дякую за гарне пояснення!
Жан-Філіп Пеллет

Дякую за це, я спробував дотримуватися декількох покрокових інструкцій щодо резервного копіювання, як ця, і не знайшов жодної згадки про цю вигадку. Це було єдине, що насправді гарантувало, що файли посилаються жорстко. Перевірка того, що кількість ls -ilah
посилань

Я використовував це в поєднанні з функцією relpath (), описаною на unix.stackexchange.com/a/85068/57414, щоб створити резервну копію $SOURCEкаталогів у $TARGETтакий спосіб:SOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
Nathan S. Watson-Haigh

13

Що ви хочете, це "cp -al":

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -повторюється, як rsync -a
  • - Я буду жорстко посилати файли, а не копіювати їх.

1
cp -alна жаль, недоступний у моїй системі (Mac OS X 10.6). Я буду використовувати пакс замість ...
Жан-Філіп Пеллет

7

--link-destВаріант в rsyncце щодо призначення каталогу, а не поточні каталог. Отже, що ви хочете:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

На жаль, я мав на увазі базову назву, спочатку я мав dirname.
Шон Рейфшнайдер

1
На головній сторінці написано, що --link-destваріант, якщо відносний , відносно цільового каталогу. У моєму випадку це абсолютно. Навіть виготовлення його відносно цільового каталогу не спрацьовує.
Жан-Філіп Пеллет

7

Виявляється, це зробити складніше, rsyncніж з іншими інструментами. Правильна відповідь - rsyncце Стівен Монаї, але найпростіший спосіб зробити це - використовувати cp -alабо pax -rwlв системах, де -lне є дійсним варіантом для cp:

pax -rwl $DATA $DATA/../upgrade_tmp

або

cp -al $DATA/ $DATA/../upgrade_tmp/

4

Це працює для мене:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

Я використовую rsync версії 3.1.0.

Від людини :

- тверді посилання

Показує rsync шукати жорстко пов'язані файли при передачі, без цієї опції жорстко пов'язані файли в передачі трактуються так, ніби вони були окремими файлами.

- link-dest = DIR

Незмінені файли важко пов'язані з DIR до каталогу призначення. Файли повинні бути однаковими у всіх збережених атрибутах (наприклад, дозволи, можливо, право власності), щоб файли були пов'язані між собою


2
Тільки фрагмента коду недостатньо, поясніть, що він робить і чому.
Peterh каже відновити Моніку

--hard-links Показує rsync шукати жорстко пов’язані файли при передачі, без цієї опції жорсткі зв'язані файли в передачі трактуються так, ніби вони були окремими файлами. --link-dest = DIR Незмінені файли важко пов'язані з DIR до каталогу призначення. Файли повинні бути однаковими у всіх збережених атрибутах (наприклад, дозволи, можливо, право власності), щоб файли були пов'язані між собою.
Олександр Федоров

1
Чудовий. Дякую. Власне, я знайшов вашу відповідь у черзі "низької якості". Це означає, що відбулося голосування, якщо вашу відповідь слід видалити чи ні. Але не тільки небезпека видалення є приводом спробувати дати чітко відформатовану, "людську" відповідь, але це також дуже допомагає, якщо ви хочете зібрати резюме.
Петер говорить, що поверніть Моніку

2

Спробуйте перейти за посиланням http://www.lessfs.com/wordpress/ це робота над COW (копія при записі) дозволить заощадити час та простір


lessfs дуже цікаво, але також дуже експериментально. Не рекомендується поки що для виробництва.
mattdm

2

Спочатку створіть каталоги лише в пункті призначення:

rsync -av --include '*/' --exclude '*' /source/ /destination/

Тоді жорстке з'єднання файлів:

cd /source
find . -type f -exec ln -v {} /destination/{} \;

Дякую - насправді я б також міг використовувати, paxяк показано в коментарі вище, що здається простіше.
Жан-Філіп Пеллет

1

Використовуйте Варіант -H, щоб зберегти посилання та прочитати сторінку.


1
-Н не працює. У мене немає жорстких посилань для збереження в моєму вихідному дереві, я просто хочу просту копію свого вихідного дерева, де в копії всі файли є твердими посиланнями на вихідні файли. Вибачте, в моєму первісному запитанні було незрозуміло…
Жан-Філіп Пеллет

це відповідь "прочитати сторінку"? :-)
meduz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.