Двусторонняя синхронизация с 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

Есть более простые решения? Спасибо.

mwm
источник
1
У меня такая же проблема. Вы нашли решение, mwm?
mouche
7
я действительно сделал сейчас. Я пытался получить опыт, подобный Dropbox, и придумал решение, которое включает unison (который использует rsync) и lsyncd для отслеживания изменений файлов. я также нашел других людей с этим решением и другими трюками » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm
в настоящее время я использую nextcloud локально на своем домашнем сервере. идеальное решение "dropbox" на 100% управляемое мной. есть клиенты android / ios / win / macos / linux / web.
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 часов, чтобы начать копирование, потому что он сканирует каждый файл перед копированием чего-либо.
Brent Faust
1
Git хорош в этом? По крайней мере, git прост в использовании, а транспортировка выполняется быстро. Для blob есть расширение, разработанное github, которое называется Large File Storage .
wener 03
1
Основные проблемы git - это большие файлы, и он действительно предназначен для явных коммитов. Оба могут быть разумно улучшены с помощью надстроек, таких как git-application, хранилище больших файлов и т. Д.
Алекс
3
@wener Не используйте молоток для шурупа или отвертку для гвоздя. :)
ADTC
2
унисон - это здорово, но тоже очень ненадежно. Примерно в 50% моих случаев использования это просто не сработало. Наиболее частой причиной этого является плохая совместимость версий. Иногда я синхронизируюсь с контентом на компьютере, на котором у меня нет прав. Если у этого сервера другая версия, чем у меня, unison не удастся. Вдобавок у меня недавно случился сбой между unison-клиентами одной и той же версии, потому что они использовали разные скомпилированные версии некоторой библиотеки (это было между компьютером ubuntu и raspberry pi).
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 не имеет возможности отслеживать возраст удаления, поэтому как этот сценарий может различать, когда локальный файл является новым (и должен быть сохранен) или старым (и должен быть удален) ? Или я недопонимаю?
Matthemattics
Удаляет ли --delete-excludedкакие-либо файлы, существующие в каталогах назначения, но не в исходных каталогах? Я думал, вам нужно определить --exclude=<filename>, не удалит ли rsync только эти исключения? Или rsync обрабатывает все файлы каталогов, не являющихся исходными, как «исключаемые»?
Mr_Moneybags
2
Нашел ответ: помимо удаления файлов на принимающей стороне, которые не находятся на отправляющей стороне, это указывает rsync также удалить любые файлы на принимающей стороне, которые исключены (см. --Exclude
Mr_Moneybags
2
Насколько я понимаю, если я создаю файл в месте назначения, а затем выполняю команду rsync для копирования из источника в место назначения, он удалит файл в месте назначения, поскольку метки времени не используются. Это не то, что вам нужно, верно?
elexhobby
10
@ Lübnah: Верно; это решение не является полной двусторонней синхронизацией : поскольку rsync with --delete-excludedзапускается с сервером в качестве источника первым: файлы, добавленные локально, будут удалены во время этого запуска (тогда как файлы, добавленные на сервер , копируются в локальную цель). Единственные локальные файлы, синхронизируемые с сервером, - это файлы, которые также существуют на сервере и были изменены локально (позже, чем серверные версии), что маловероятно в сценарии OP. Как вы намекаете, мне кажется, что настоящая двусторонняя синхронизация невозможна rsync, потому что требуется сохранение состояния между запусками.
mklement0 06
3

Вы можете попробовать csync , это движок синхронизации под капотом owncloud .

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

Сейчас я использую SparkleShare https://www.sparkleshare.org/

работает на Mac, Linux и Windows.

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

Я не уверен, работает ли это с синхронизацией двух, но для работы --delete вам также необходимо добавить параметр --recursive.

Boardy
источник
1
Эквивалент короткого варианта --recurseявляется -r, что ФП в использовании (встроенный в группе сжатых опций -avzru).
mklement0 07
0

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

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 года.

user1461607
источник
Он не поддерживает двухстороннюю синхронизацию: rclone.org/commands/rclone_sync
Мартин Браун