Двостороння синхронізація з rsync


95

У мене є папка a / та віддалена папка A /. Тепер я запускаю щось подібне до Makefile:

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

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

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

У rsync є параметри --delete та --delete-after, які допомагають здійснити те, що я хочу, але справа в тому, що вона не працює при двосторонній синхронізації.

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

Справа в тому, що у мене є 3 машини в контексті:

  1. робочий стіл
  2. зошит
  3. домашній сервер

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

Я думаю, це можливо лише за допомогою бази даних та відстеження операцій: P

Якісь простіші рішення? Дякую.


1
У мене така сама проблема. Ви знайшли рішення, mwm?
Mouche

7
я насправді зробив це зараз. я намагався досягти подібного досвіду, і придумав рішення, яке передбачає унісон (який використовує rsync) та lsyncd для моніторингу змін у файлах. я також знайшов інших людей із цим рішенням та іншими трюками » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

сьогодні я використовую nextcloud локально на своєму домашньому сервері. ідеальне рішення "dropbox" на 100% кероване мною. має android / ios / win / macos / linux / веб-клієнтів.
mwm

Відповіді:


63

Спробуйте Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Синтаксис: unison dirA/ dirB/

Unison запитує, що робити, коли файли відрізняються, але ви можете автоматизувати процес, використовуючи наведені нижче параметри, які приймають параметри за замовчуванням (несуперечливі):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ взагалі не задає питань і пише, щоб вивести, скільки файлів було проігноровано (оскільки вони конфліктували).


7
Unison досить простий у використанні для невеликих каталогів. Але це болісно ПОВІЛЬНО для каталогів з великою кількістю файлів. Там, де rsync почне копіювати майже відразу, на початок копіювання іноді потрібно більше 12 годин, оскільки він сканує кожен файл, перш ніж щось копіювати.
Брент Фауст,

1
Це git добре в цьому? Принаймні git простий у використанні, а транспорт швидкий. Для BLOB існує розширення, розроблене github, яке називається Large File Storage .
wener

1
Основними проблемами git є великі файли і те, що він справді розроблений для явних комітів. І те, і інше можна розумно покращити такими доповненнями, як git-annex, велике сховище файлів тощо
alex

3
@wener Не використовуйте молоток для гвинта або викрутку для цвяха. :)
ADTC

2
унісон - це чудово, але і дуже ненадійно. Приблизно в 50% випадків мого використання це просто не спрацювало. Найпоширенішою причиною цього є погана можливість інтерфейсу. Я іноді синхронізую вміст на комп’ютері, на який я не маю привілеїв. Якщо на цьому сервері трапляється інша версія, ніж у мене, unison не вдається. Крім того, нещодавно у мене стався збій між клієнтами унісон тієї самої версії, оскільки вони використовували різні скомпільовані версії якоїсь бібліотеки (це було між комп’ютером ubuntu та малиновим пі).
argentum2f


5

Ви можете використовувати Osync: http://www.netpower.fr/osync , який rsync заснований на інтелектуальному розповсюдженні видалення. він також має безліч варіантів, таких як відновлення зупиненого виконання, м'яке видалення та контроль часу.


5

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

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


4

Спробуйте це,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Я просто перевіряю це, і це спрацювало для мене. Я роблю двосторонню синхронізацію між Windows7 (за допомогою cygwin із встановленим пакетом rsync) та файловим сервером FreeNAS (FreeNAS працює на FreeBSD із попередньо встановленим пакетом rsync).


3
Чи не буде видалено нові локальні файли? -uпропускає новіші файли в пункті призначення, але rsync не має способу відстеження віку видалення, тож як цей скрипт може розрізняти, коли локальний файл є новим (і повинен зберігатися) або старим (і повинен бути видалений) ? Або я нерозумію?
Математика

Чи --delete-excludedвидаляє будь-які файли, що існують у цільових каталогах, але не у вихідних каталогах? Я думав, вам потрібно було визначити, --exclude=<filename>тож чи rsync не видалить лише ці виключення? Або rsync розглядає всі файли каталогів, що не є джерелом, як "виключає"?
Mr_Moneybags

2
Знайшов відповідь: Окрім видалення файлів на стороні одержувача, які не на стороні відправника, це говорить rsync також видалити всі файли на стороні одержувача, які виключені (див. --Exclude
Mr_Moneybags

2
З того, що я розумію, якщо я створю файл у пункті призначення, а потім виконую команду rsync для копіювання з джерела в пункт призначення, він видалить файл у пункті призначення, оскільки не використовуються позначки часу. Це не те, що ти хочеш правильно?
elexhobby

10
@ Любна: Правильно; це рішення не є повноцінною двосторонньою синхронізацією : оскільки rsync with --delete-excludedзапускається із сервером як джерелом : файли, додані локально, будуть видалені під час цього запуску (тоді як файли, додані на сервер , копіюються до локальної цілі). Єдиними локальними файлами, які синхронізуються із сервером, є файли, які також існують на сервері та були змінені локально (нещодавно, ніж версії сервера) - що, ймовірно, не передбачено сценарієм операційної системи. Як ви натякаєте, мислює справжню двосторонню синхронізацію неможливо rsync, оскільки необхідний стан збереження між прогонами.
mklement0

3

Ви можете спробувати csync , це механізм синхронізації під капотом owncloud .


2
Станом на 2018 рік, розробка csync, здається, зупинилася, і власний хмар виглядає так, ніби вони це розгалужують. Див: github.com/owncloud/client/issues/4661 для більш докладної інформації
до Аарона

1

Зараз я використовую SparkleShare https://www.sparkleshare.org/

працює на Mac, Linux та Windows.


з часом я постійно оновлюю своє рішення. Зараз я використовую nextcloud на своєму домашньому сервері. синхронізація з клієнтом nextcloud на linux, mac, windows, android та ios.
mwm

0

Я не впевнений, чи працює це з двома синхронізаціями, але для роботи --delete потрібно також додати параметр --recursive.


1
Еквівалент короткого варіанту --recurseє -r, що ФП в використанні (вбудований в групі стислих опцій -avzru).
mklement0

0

Ви можете використовувати cloudsync для синхронізації папки з пультом дистанційного керування:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Якщо пульт дистанційного керування NFS, ви можете використовувати:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs

-1

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


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