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

У меня есть папка 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

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


person mwm    schedule 29.05.2010    source источник
comment
У меня такая же проблема. Вы нашли решение, mwm?   -  person mouche    schedule 13.02.2011
comment
я действительно сделал сейчас. Я пытался получить опыт, подобный Dropbox, и придумал решение, которое включает в себя unison (который использует rsync) и lsyncd для отслеживания изменений файлов. я также нашел других людей с этим решением и другими хитростями сверху »cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu   -  person mwm    schedule 26.04.2011
comment
в настоящее время я использую nextcloud локально на своем домашнем сервере. идеальное решение для Dropbox, на 100% управляемое мной. есть клиенты android / ios / win / macos / linux / web.   -  person mwm    schedule 13.03.2018


Ответы (11)


Попробуйте Unison: http://www.cis.upenn.edu/%7Ebcpierce/unison/

Синтаксис:

unison dirA/ dirB/

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

unison -auto dirA/ dirB/

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

Примечание. Я больше не использую Unison (я использую NextCloud, который не соответствует исходному варианту использования). Однако обратите внимание, что rsync не предназначен для двунаправленной синхронизации, а unison -. unison может иметь свои ошибки (как и любое другое программное обеспечение) и свои недостатки. Я удивлен, что он, кажется, сейчас активно поддерживается (в прошлый раз, когда я смотрел, мне показалось, что он выглядел мертвым), но я не уверен, в каком состоянии сейчас. У меня не было необходимости в двустороннем синхронизаторе файлов, поэтому могут быть варианты получше.

person alex    schedule 29.05.2010
comment
Кстати, если вы думаете, что вы ограничены rsync, потому что у вас недостаточно прав для установки unison - вы все равно можете установить unison с помощью префикса. - person Igor; 18.01.2013
comment
Unison довольно просто использовать для небольших справочников. Но это мучительно МЕДЛЕННО для каталогов с большим количеством файлов. Если rsync начнет копирование почти сразу, унисон иногда занимает более 12 часов, чтобы начать копирование, потому что он сканирует каждый файл, прежде чем что-либо копировать. - person Brent Faust; 17.06.2014
comment
Git хорош в этом? По крайней мере, git прост в использовании и транспортировка выполняется быстро. Для blob существует расширение, разработанное github, которое называется Большое файловое хранилище. - person wener; 03.06.2015
comment
Основные проблемы git - это большие файлы, и он действительно предназначен для явных коммитов. И то, и другое можно разумно улучшить с помощью надстроек, таких как git-application, хранилище больших файлов и т. Д. - person alex; 04.06.2015
comment
@wener Не используйте молоток для шурупа или отвертку для гвоздя. :) - person ADTC; 22.08.2016
comment
Если вы синхронизируете, например музыкальная библиотека, в которой вы заботитесь о двустороннем удалении файлов, но не заботитесь о конфликтах содержимого файлов, вы можете использовать флаг Unison -fastercheckUNSAFE, чтобы значительно ускорить Unison. Он не будет вычислять хэш содержимого файла, а просто будет смотреть на временную метку / длину и перезаписывать, если он новее. См. руководство - person KrisWebDev; 04.06.2017
comment
@ADTC, если забивание винта сработает, не стесняйтесь долбить. - person lucid_dreamer; 25.08.2017
comment
унисон - это здорово, но тоже очень ненадежно. Примерно в 50% моих случаев использования это просто не сработало. Наиболее частая причина этого - плохая совместимость версий. Иногда я синхронизируюсь с контентом на компьютере, на котором у меня нет прав. Если у этого сервера другая версия, чем у меня, унисон не удастся. Вдобавок у меня недавно случился сбой между unison-клиентами одной и той же версии, потому что они использовали разные скомпилированные версии некоторой библиотеки (это было между компьютером ubuntu и raspberry pi). - person argentum2f; 10.02.2018
comment
Это не масштабируемое решение, так как здесь нет -dryrun и страницы руководства. Лучше использовать более простые и известные инструменты, такие как rsync, чем изобретать велосипед с миллионом опций, которые вам не нужны. - person ; 09.03.2019
comment
Унисонная версия должна быть одинаковой с обеих сторон, иначе унисон-ревю будет работать. Вот почему я ищу альтернативу. - person guettli; 03.09.2019
comment
ИЗБЕГАЙТЕ ИСПОЛЬЗОВАНИЯ UNISON !! У меня он уже 2 месяца работает на cron, версии не менял ни с одной стороны. сегодня я заметил, что некоторые папки отсутствуют. иногда оказывается, что он не работает и просто удаляет папки, с которыми у него есть проблемы. в итоге было удалено около половины вложенных папок. К счастью, у меня были резервные копии, и я все восстановил. rsync в 100 раз надежнее, чем unison. - person ierdna; 19.07.2021

Вы также можете попробовать bitpocket: https://github.com/sickill/bitpocket

person saif    schedule 01.01.2012

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

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

person Dario Fumagalli    schedule 13.03.2014

Попробуй это,

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).

person Chris Collins    schedule 02.06.2012
comment
Не удалит ли это новые локальные файлы? -u пропускает файлы более новые в месте назначения, но rsync не имеет возможности отслеживать возраст удаления, поэтому как этот сценарий может различать, когда локальный файл является новым (и должен быть сохранен) или старым (и должен быть удален) )? Или я недопонимаю? - person Matthemattics; 26.08.2013
comment
--delete-excluded Удаляет ли какие-либо файлы, существующие в каталогах назначения, но не в исходных каталогах? Я думал, вам нужно определить --exclude=<filename>, чтобы rsync не удалял только эти исключения? Или rsync обрабатывает все файлы каталогов, не являющихся исходными, как исключаемые? - person Mr_Moneybags; 17.09.2013
comment
Нашел ответ: помимо удаления файлов на принимающей стороне, которые не находятся на стороне отправителя, это указывает rsync также удалить любые файлы на принимающей стороне, которые исключены (см. --Exclude) rsync.samba.org/ftp/rsync/rsync.html - person Mr_Moneybags; 17.09.2013
comment
Насколько я понимаю, если я создаю файл в месте назначения, а затем выполняю команду rsync для копирования из источника в место назначения, он удалит файл в месте назначения, поскольку метки времени не используются. Это не то, что вам нужно, верно? - person elexhobby; 11.02.2014
comment
@ Lübnah: Верно; это решение не является полной двусторонней синхронизацией: поскольку rsync с --delete-excluded запускается с сервером в качестве source first: files добавленные локально будут удалены во время этого запуска (тогда как файлы, добавленные на сервер , копируются в локальную цель). Единственные локальные файлы, синхронизируемые с сервером, - это файлы, которые также существуют на сервере и были изменены локально (позднее, чем серверные версии), что маловероятно в Сценарий ОП. Как вы намекаете, мне кажется, что настоящая двусторонняя синхронизация не может быть выполнена с rsync, потому что требуется сохранение состояния между запусками. - person mklement0; 07.06.2014

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

person Orsiris de Jong    schedule 18.08.2013

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

person marton78    schedule 01.02.2013
comment
По состоянию на 2018 год разработка csync, похоже, застопорилась, и owncloud выглядит так, как будто они его разветвляют. Подробнее см. github.com/owncloud/client/issues/4661. - person Aaron; 31.10.2018

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

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

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

Я удивлен, что никто еще не упомянул Syncthing. Я использую его в течение многих лет для синхронизации своего телефона, планшета и двух ноутбуков. Однажды я также использовал его, чтобы отправить 10 ГБ фотографий моей семье ~ 600 км, прямо с моей машины на их машину, и это было невероятно быстро (несмотря на то, что данные перенаправлялись через сервер обнаружения Syncthing для решения проблем с NAT). В какой-то момент я также пробовал OwnCloud / NextCloud, но Syncthing оказался намного надежнее и, кроме того, намного быстрее.

person balu    schedule 30.04.2021

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

person Boardy    schedule 21.03.2012
comment
Краткий эквивалент опции --recurse - -r, который OP использует (встроен в группу сжатых опций -avzru). - person mklement0; 07.06.2014

Вы можете использовать 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
person Erik Aronesty    schedule 20.05.2020

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

person user1461607    schedule 19.02.2019
comment
Он не поддерживает двустороннюю синхронизацию: rclone.org/commands/rclone_sync - person Martin Braun; 19.12.2019