Двухсторонняя синхронизация с rsync
У меня есть папка / и удаленная папка /. Теперь я запускаю что-то вроде этого на 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 машины в контексте:
- рабочий стол
- ноутбук
- домашний сервер
Таким образом, иногда на сервере будут файлы, которые были удалены с синхронизацией с ноутбуком, например, и затем, когда я запускаю синхронизацию с моим рабочим столом (где все еще существуют удаленные файлы сервера), я хочу, чтобы эти файлы были удалены, а не удалены. скопировал снова на сервер.
Я думаю, это возможно только с базой данных и отслеживанием операций:P
Есть более простые решения? Спасибо.
12 ответов
Попробуйте Unison: http://www.cis.upenn.edu/~bcpierce/unison/
Синтаксис:
unison dirA/ dirB/
Unison спрашивает, что делать, когда файлы различаются, но вы можете автоматизировать процесс, используя следующие параметры, которые принимают параметры по умолчанию (не конфликтующие):
unison -auto dirA/ dirB/
unison -batch dirA/ dirB/
вообще не задает вопросов и пишет для вывода, сколько файлов было проигнорировано (потому что они конфликтовали).
Я удивлен, что никто еще не упомянул Syncthing . Я использую его в течение многих лет для синхронизации своего телефона, планшета и двух ноутбуков. Однажды я также использовал его, чтобы отправить 10 ГБ фотографий моей семье ~600 км, прямо с моей машины на их машину, и это было невероятно быстро. В какой-то момент я также пробовал OwnCloud / NextCloud, но Syncthing оказался намного надежнее и, кроме того, намного быстрее.
Поскольку первоначальный вопрос также касается настольного компьютера и ноутбука и примера с музыкальными файлами (следовательно, он, вероятно, использует графический интерфейс), я бы также упомянул одну из лучших на сегодняшний день двунаправленных, мультиплатформенных, бесплатных и программ с открытым исходным кодом: FreeFileSync,
Он основан на графическом интерфейсе пользователя, очень быстр и интуитивно понятен, поставляется с фильтрацией и многими другими опциями, включая возможность удаленного подключения, просмотра и интерактивного управления "коллизиями" (например, файлами с одинаковыми временными метками) и переключения между двунаправленной передачей, зеркалированием и скоро.
Вы также можете попробовать Bitpocket: https://github.com/sickill/bitpocket
Попробуй это,
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).
Вы можете использовать Osync: http://www.netpower.fr/osync, основанный на rsync с интеллектуальным распространением удаления. он также имеет несколько параметров, таких как возобновление приостановленного выполнения, мягкое удаление и контроль времени.
Я сейчас использую SparkleShare https://www.sparkleshare.org/
работает на Mac, Linux и Windows.
Rclone - это то, что вы ищете. Rclone ("rsync для облачного хранилища") - это программа командной строки для синхронизации файлов и каталогов между различными поставщиками облачного хранилища, включая локальные файловые системы. Ранее Rclone был известен как Swiftsync и был доступен с 2013 года.
Да, есть более простое решение под названием Resilio Connect . Я уверен, что невозможно выполнить полную двустороннюю синхронизацию с rsync. Если вы добавите больше машин, это будет еще сложнее. Проблема с rsync заключается также в том, что существуют границы между процессором и диском, медленные вычисления дельты внутри файла для больших файлов и т. Д., Но одноранговое решение будет работать нормально. Также Resilio является кроссплатформенным с самой популярной поддержкой ОС, включая мобильную. Вот описание, обсуждающее альтернативы rsync.
Я не уверен, работает ли он с двумя синхронизаторами, но для работы --delete вам также необходимо добавить параметр --recursive.
Вы можете использовать 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