RSync: Як синхронізувати в обох напрямках?


85

Я хочу використовувати rsync для синхронізації двох каталогів в обох напрямках.

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

Чи можна це зробити за допомогою rsync (переважно в режимі Linux) ?
Якщо ні, то які ще рішення існують?


3
Я вірю, що на serverfault.com ви отримаєте кращі відповіді.
Естебан Кюбер

Відповіді:


78

Просто запустіть його двічі, з "новішим" режимом (-u або --update прапор) плюс -t (для копіювання часу модифікації файлу), -r (для рекурсивних папок) та -v (для детального виводу, щоб побачити, що це таке робити):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

Це не буде обробляти видалення, але я не впевнений, що є хороше рішення цієї проблеми лише з періодичною синхронізацією.


3
Оскільки питання стосувалось rsync, я позначу цю відповідь як правильну.
java.is.for.desktop

2
Але ви запитували і про інші рішення, і Unison робить кращу роботу, інакше я б ніколи не згадував про інший інструмент. Я розумію, що у вас, можливо, є конкретні обставини, які сприяють використанню rsync.
MaD70

1
Sheesh, ти отримуєш 6 голосів проти і все ще скаржишся? <j / k> Unison - це справді цікаве рішення, і я радий, що ви про це згадали. :)
jsight

2
Ну, я не скаржуся, я пояснюю. Тільки щоб перевірити, що я чогось не пропускаю (не будучи носієм англійської мови).
MaD70

1
MaD70 - Не біда ... Я просто жартував. :)
jsight 02

64

Чи знаєте ви Unison File Synchronizer ?

Unison - це інструмент синхронізації файлів для Unix та Windows. Це дозволяє зберігати дві репліки колекції файлів і каталогів на різних хостах (або різних дисках на одному хості), модифікувати їх окремо, а потім актуалізувати шляхом поширення змін у кожній репліці на іншу. ...

Зауважте також, що він стійкий до відмови:

Унісон стійкий до невдач. Обережно залишати репліки та власні приватні структури в розумному стані у будь-який час, навіть у випадку ненормального припинення або збою зв'язку.


3
+1. Unison - найкращий спосіб зробити це. Double-rsync важко отримати правильно і зовсім не обробляє видалення.
Авді,

Так, Unison є стійким до несправностей. Я оновлюю свою відповідь, щоб наголосити на цьому.
MaD70

6
Не чув про Унісон. Ви несете відповідальність за те, щоб сьогодні переробити сценарії резервного копіювання вдома.
Естебан Кюбер

1
Я радий, що моя відповідь настільки корисна (це показує, яким може бути практичний інструмент, заснований на надійних теоретичних засадах).
MaD70

Ось короткий підручник з Unison на linuxjournal.
лепе

14

Вам потрібно запустити rsyncдвічі, і я рекомендую запускати його за допомогою -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a для архіву) - це ярлик для -rlptgoD:

  • -r Зверніться до підкаталогів
  • -l Також синхронізуйте символічні посилання
  • -p Також синхронізуйте дозволи файлів
  • -t Також синхронізуйте час модифікації файлу
  • -g Також синхронізуйте групи файлів
  • -o Також синхронізувати власника файлу
  • -D Також синхронізуйте спеціальні (не звичайні / мета) файли

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

Але вам також потрібно, -uоскільки це говорить, rsyncщоб повністю залишити будь-який файл / папку в спокої, якщо він уже існує в пункті призначення та має останню дату останньої модифікації. Без -u rsyncсинхронізації, незалежно від того, файл чи папка новіший чи ні .

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

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

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


Красиво покладено.
Пітер Роунтрі,

6

Дякую jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Це призведе до повторної синхронізації відразу після закінчення 1-ї синхронізації. Якщо структура каталогів величезна, це заощадить час, оскільки не потрібно сидіти перед ПК. Якщо структура величезна, видаліть багатослівний та прогресивний матеріал

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

1
Просто цікаво, чи варто мені додати -t для копіювання часу модифікації файлу. Чи є причина, чому я повинен залишити -t осторонь?
chrips

@Chrips Ні, я не думаю. Здається, що метою цієї відповіді було лише показати, що ви можете використовувати &&між двома командами автоматичний запуск 2-ї команди відразу після 1-ї команди (якщо 1-а команда успішна), на відміну від ручної роботи одна за одною, як у відповіді @ jsight. Крім того, я думаю, що відповідь @ jsight була відредагована, щоб включити -tопцію після розміщення цієї відповіді.
Ruben9922

1

Використовуйте rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

наприклад:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Синхронізує xxx-файли з різними файлами / xxx-файлами. Якщо файли з різними матеріалами / xxx не існували, він створить їх - тобто скопіює.

-pogtEtv - просто купа варіантів збереження метаданих файлів, плюс v - багатослівний та r - рекурсивний

--progress - показувати хід синхронізації в режимі реального часу - надзвичайно корисно, якщо ви копіюєте великі файли

--bwlimit=2000 - встановлює максимальну швидкість копіювання / синхронізації (bw = пропускна здатність)

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

Щасти!


0

Я використовую rsyncз inotifywait. При зміні будь-якого файлу rsyncбуде виконано.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Вам потрібно запустити inotifywaitна обох хостах. Будь ласка, перевірте приклад inotifywait


0

Вам потрібен Rclone . Rclone ("rsync для хмарного сховища") - це програма командного рядка Linux для синхронізації файлів та каталогів з різними постачальниками хмарних сховищ (box, dropbox, ftp тощо) та локальними файловими системами. Rlone підтримує лише дзеркальну синхронізацію.

Ще одним графічним рішенням, яке включає синхронізацію в реальному часі, було б використання FreeFileSync , що включає програму RealTimeSync. FreefileSync підтримує двосторонню двонаправлену синхронізацію, що включає обробку видалень.

Графічний інтерфейс FreFileSync


0

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

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