Как сохранить автоматическую синхронизацию двух папок?


86

Я хотел бы иметь синхронизированную копию одной папки со всем ее поддеревом.

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

Как лучше всего подойти к этой задаче?

Кстати: я использую Ubuntu 12.04

Конечная цель - иметь отдельную резервную копию в реальном времени без использования символических ссылок или монтирования. Я использовал Ubuntu One для синхронизации данных между моими компьютерами, и через некоторое время что-то пошло не так, и все мои данные были потеряны во время синхронизации.

Поэтому я решил добавить еще один шаг, чтобы сохранить резервную копию моих данных:

  • Я храню свои данные в «папке А»
  • Мне нужен ответ на мой текущий вопрос, чтобы создать одностороннюю синхронизацию «папки A» с «папкой B» ( cronсценарий с rsync? Может быть?). Мне нужно, чтобы он был односторонним только из A в B, любые изменения в B не должны применяться к A.
  • Я просто синхронизирую «папку B» с Ubuntu One.

    Таким образом, любое изменение в A будет добавлено к B, которое будет обнаружено из U1 и синхронизировано с облаком. Если что-то пойдет не так и U1 удалит мои данные на B, они всегда будут на A.

Вдохновленный комментариями lanzz, другой идеей может быть запуск rsync при запуске для резервного копирования содержимого папки в Ubuntu One и запуск Ubuntu One только после завершения rsync.

Что ты об этом думаешь? Как узнать, когда закончится rsync?


Что вы пытаетесь достичь? Действительно ли папки должны быть разделены, нельзя ли символически связать одно имя с другим или связать каталог с дополнительным расположением? Также обратите внимание на эти результаты поиска .
lanzz

1
Я бы посоветовал против фактической живой синхронизации (т.е. непрерывно следит за изменениями файлов в исходном каталоге) в пользу периодической rsyncчерез хрон.
lanzz

Ответы:


99

Вы можете использовать inotifywaitmodify,create,delete,moveвключенными флагами) и rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Если inotifywaitв вашей системе его нет, запуститеsudo apt-get install inotify-tools


3
Вы могли бы хотеть рассмотреть , чтобы добавить -e ssh user@remote:/targetк , rsyncесли вы хотите использовать SSH в качестве транспорта для доступа к удаленной машине.
Falcon

2
Спасибо @Falcon, обычно использую rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Однако я хотел написать простой ответ.
silgon

4
чтобы уточнить: это одноразовая вещь, или вы бы добавили это в bashrc или что-то в этом роде?
Брэд Джонсон

1
Вы можете рассматривать весь цикл while как процесс, который при необходимости синхронизируется. Обычно я добавляю его в Makefile проекта, над которым работаю. Таким образом я могу выбрать сервер и каталог, в котором я хочу его сохранить. Один из моих вариантов использования - когда я программирую алгоритмы глубокого обучения на своем ноутбуке и синхронизирую их для выполнения тяжелого процесса на выделенном компьютере с улучшенным процессором и графическим процессором. Я также исключаю файлы, которые мне не нужны, например .gitпапку.
silgon

2
Это не обрабатывает переименования файлов, используйтеmodify,create,delete,move
urusha

24

Вам нужно что-то вроде этого: https://github.com/axkibe/lsyncd Это инструмент, который сочетает в себе rsync и inotify - первый инструмент, который с правильной настройкой параметров зеркально отображает каталог до последнего бита. Последний указывает ядру уведомлять программу об изменениях в каталоге или файле. Он говорит:

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

Но - согласно Digital Ocean на https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - он должен быть в репозиторий Ubuntu!

У меня похожие требования, и этот инструмент, который мне еще предстоит попробовать, кажется подходящим для этой задачи.


1
lsyncd сначала казался серебряной пулей, но в нем есть много открытых проблем, и, очевидно, реализация macOS «старая и устаревшая». Не смог заставить работать 10.12.
оплачиваемый ботаник

@apaidnerd Если честно, открыто 90 вопросов против 420 закрытых. Правда, за последний год закрыли только 10/40 выпусков.
Матин Улхак,

8

Просто простая модификация ответа @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(версия @silgon иногда дает сбой на Ubuntu 16, если вы запустите ее в cron)


2
Зачем запускать его в cron?
Saygley

@saygley Для конкретной задачи после перезагрузки Ubuntu процесс синхронизации должен запускаться автоматически
Денис Кузин

5
Понятно ... Тем не менее, поскольку это обычно должно запускаться один раз и работать, пока сервер работает; Вместо этого я бы рассмотрел что-то встроенное в rc.local.
Saygley

2

Вы можете воспользоваться fschange . Это уведомление об изменении файловой системы Linux. Исходный код можно скачать по указанной выше ссылке, вы можете скомпилировать его самостоятельно. fschangeможет использоваться для отслеживания изменений файла путем чтения данных из файла proc (/ proc / fschange). Когда данные записываются в файл, fschange сообщает точный интервал, который был изменен, а не просто сообщает, что файл был изменен. Если вы ищете более продвинутое решение, я бы посоветовал проверить Resilio Connect . Он кроссплатформенный, предоставляет расширенные возможности использования и мониторинга. Поскольку он основан на BitTorrent, он работает быстрее, чем любой другой существующий инструмент синхронизации. Это было написано от их имени.


0

Я использую эту бесплатную программу для синхронизации локальных файлов и каталогов: https://github.com/Fitus/Zaloha.sh . Репозиторий также содержит простую демонстрацию.

Хороший момент: это сценарий оболочки bash (только один файл). Не черный ящик, как другие программы. Документация тоже есть. Кроме того, обладая некоторыми техническими талантами, вы можете «согнуть» и «интегрировать» его, чтобы создать окончательное решение, которое вам нравится.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.