2010-05-29 3 views
78

У меня есть папка a/и удаленная папка A /. я теперь запустить что-то вроде этого на Makefile:Двухсторонняя синхронизация с rsync

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, чтобы помочь выполнить то, что я хочу, но это так, это не работает на двухсторонней синхронизации.

Если я хочу удалить файлы сервера на syn, когда локальные файлы были удалены, он работает, но если по какой-либо причине (объясняется после), у меня есть некоторые файлы, которые не находятся на сервере, но существуют локально и они были удалены, я хочу локально удалить их, а не копировать сервер (как это бывает).

Вещь, у меня есть 3 машины в контексте:

  1. настольные
  2. ноутбук
  3. домашний сервер

Так, иногда, сервер будет иметь файлы, которые были удалены с блокнотом sync, например, и затем, когда я запускаю синхронизацию с моим рабочим столом (там, где все файлы удаленного сервера все еще существуют), я хочу, чтобы эти файлы были удалены и не были скопированы снова на сервер.

Я думаю, что это возможно только с базой данных и трек операций: P

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

+1

У меня есть эта проблема. Вы нашли решение, mwm? – mouche

+2

К сожалению, нет. – mwm

+7

Я действительно сделал сейчас. я пытался добиться такого эффекта, как Dropbox, и придумал решение, которое включает унисон (который использует rsync) и lsyncd для мониторинга изменений файлов. я также нашел других людей с этим решением и больше трюков сверху »http://www.cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu/ – mwm

ответ

54

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

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

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

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ не задает никаких вопросов и пишет для вывода, сколько файлов w были проигнорированы (потому что они противоречили).

+0

Кстати, если вы думаете, что вы ограничены rsync, потому что у вас недостаточно привилегий для установки unison - [вы все еще можете установить unison с помощью префикса] (http://i3vi3v.wordpress.com/2013/01/09/zend-studio-syncing -files-with-remote-server-using-unison /). – Igor

+6

Unison довольно прост в использовании для небольших каталогов. Но это мучительно SLOW для каталогов с большим количеством файлов. Когда rsync начнет копировать почти сразу, унисон иногда занимает более 12 часов, чтобы начать копирование, потому что он сканирует каждый файл перед копированием чего-либо. –

+1

Это хорошо для этого? По крайней мере, git прост в использовании и транспорт быстрый.for blob есть расширение, разработанное github под названием [Large File Storage] (https://git-lfs.github.com). – wener

0

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

+0

Короткий эквивалент опции '--recurse' -' -r', который используется OP _is_ (встроен в группу сжатых опций '-avzru'). – mklement0

5

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

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 не имеет способа отслеживать возраст удаления, поэтому как этот сценарий может различаться, когда локальный файл является новым (и должен быть сохранен) или старым (и следует удалить)? Или я не понимаю? – Matthematics

+0

Удаляет ли '--delete-excluded' все файлы, которые существуют в каталогах назначения, но не исходные каталоги? Я думал, вам нужно определить '--exclude = ', поэтому не будет rsync удалять только эти исключения? Или rsync обрабатывает все файлы исходных каталогов как «исключающие»? –

+2

Нашел ответ: В дополнение к удалению файлов на принимающей стороне, которые не находятся на стороне отправки, это говорит rsync также удалять любые файлы на принимающей стороне, которые исключены (см. --exclude) http: // rsync.samba.org/ftp/rsync/rsync.html –

5

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

3

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

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

Смежные вопросы