RSync: как синхронизировать в обоих направлениях?


85

Я хочу использовать rsync для синхронизации двух каталогов в обоих направлениях.

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

Можно ли это сделать с помощью rsync (желательно в Linux) ?
Если нет, то какие еще существуют решения?


3
Я верю, что на serverfault.com вы получите более точные ответы.
Эстебан Кюбер,

Ответы:


78

Просто запустите его дважды, используя «новый» режим (флаг -u или --update) плюс -t (для копирования времени изменения файла), -r (для рекурсивных папок) и -v (для подробного вывода, чтобы увидеть, что это такое. делаю):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

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


3
Поскольку вопрос касался rsync, отмечу этот ответ как правильный.
java.is.for.desktop

2
Но вы спрашивали и о других решениях, и Unison работает лучше, иначе я бы никогда не упомянул другой инструмент. Я понимаю, что у вас, возможно, есть особые обстоятельства, которые способствуют использованию rsync.
MaD70,

1
Блин, ты получил 6 голосов и все еще жалуешься? <j / k> Unison - действительно интересное решение, и я рад, что вы упомянули о нем. :)
jsight

2
Ну я не жалуюсь, я объясняю. Просто чтобы убедиться, что я чего-то не упускаю (не являюсь носителем английского языка).
MaD70,

1
MaD70 - Без проблем ... Я пошутил. :)
jsight 02

64

Вы знаете Unison File Synchronizer ?

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

Также обратите внимание, что он устойчив к сбоям:

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


3
+1. Унисон - лучший способ сделать это. Double-rsync сложно понять, и он вообще не обрабатывает удаления.
Avdi

Да, Unison устойчив к ошибкам. Я обновляю свой ответ, чтобы подчеркнуть это.
MaD70,

6
Не слышал об Unison. Вы обязаны заставить меня переделать мои сценарии резервного копирования сегодня дома.
Эстебан Кюбер,

1
Я рад, что мой ответ настолько полезен (это показывает, насколько практичным может быть инструмент, основанный на прочной теоретической основе).
MaD70,

Вот краткое руководство по Unison на linuxjournal.
lepe

14

Вам нужно запустить rsyncдважды, и я рекомендую запустить его с помощью -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a для архива) - это ярлык для -rlptgoD:

  • -r Рекурсия в подкаталоги
  • -l Также синхронизировать символические ссылки
  • -p Также синхронизировать права доступа к файлам
  • -t Также синхронизировать время модификации файла
  • -g Также синхронизировать группы файлов
  • -o Также синхронизировать владельца файла
  • -D Также синхронизировать специальные (не обычные / мета) файлы

В принципе, всякий раз, когда вы хотите создать идентичную копию один-к-одному rsync, вы всегда должны использовать это, -aпоскольку большинство пользователей ожидают этого, когда они говорят о « синхронизации ». Другие ответы здесь, похоже, упускают из виду, что иногда содержимое файла остается неизменным, но его владелец, возможно, изменился или его права доступа могли измениться, и в этом случае rsyncне будет синхронизироваться файл, что может быть фатальным.

Но вам также необходимо, -uпоскольку это говорит о том, rsyncчтобы полностью оставить в покое любой файл / папку, если он уже существует в месте назначения и имеет более новую дату последнего изменения. Без -u rsyncсинхронизации будет выполняться независимо от того, является ли файл / папка более новым или нет .

Обратите внимание, что это решение не может обрабатывать удаленные файлы. Обработка удалений не является простой возможной, поскольку рассмотрим следующую ситуацию: файл был удален в источнике, теперь как rsyncузнать, существовал ли этот файл когда-то и был ли удален (в этом случае он должен быть удален и в месте назначения) или он никогда не существовал в источнике (в этом случае он должен быть скопирован из места назначения). Эти две ситуации выглядят одинаково, rsyncпоэтому он не может знать, как правильно реагировать. Синхронизация наоборот не поможет, поскольку это может привести к той же ситуации: файл существует в источнике, но не в месте назначения. Почему? Он никогда не существовал в месте назначения или был удален? Оба случая выглядят одинаково rsync.

Инструменты синхронизации, которые могут надежно синхронизировать удаленные файлы, обычно ведут журнал синхронизации обо всех прошлых операциях синхронизации. Если этот журнал показывает, что когда-то был файл и был синхронизирован, но теперь он отсутствует, очевидно, что он был удален. Если такого файла по журналу никогда не было, его необходимо синхронизировать. Сохраняя все записи журнала с отметками времени, даже возможно, что удаленный файл вернется и будет удален несколько раз, но инструмент синхронизации всегда будет знать, что делать, и результат всегда будет правильным. rsyncне имеет такого журнала, он полагается только на текущее состояние файла двух сторон операции.

Однако вы можете создать себе команду синхронизации, используя rsyncнебольшой сценарий оболочки POSIX, который уже очень близок к инструменту синхронизации, как описано выше. Поскольку мне сам был нужен такой инструмент, вот ответ на Stackoverflow, который проведет вас через создание такого скрипта.


Красиво поставлен.
Питер Раунтри,

6

Спасибо jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

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

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

1
Просто интересно, должен ли я добавить -t, чтобы скопировать время изменения файла. Есть ли причина, по которой я должен уйти?
chrips

@Chrips Нет, я так не думаю. Похоже, что цель этого ответа заключалась в том, чтобы просто показать, что вы можете использовать &&между двумя командами для автоматического запуска 2-й команды сразу после 1-й команды (если 1-я команда успешна), а не вручную запускать одну за другой как в ответе @jsight. Кроме того, я думаю, что ответ @jsight был отредактирован, чтобы включить этот -tпараметр после публикации этого ответа.
Ruben9922 08

1

Использовать rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

например:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Синхронизирует xxx-файлы с разными-материалами / xxx-файлами. Если разных-файлов / xxx-файлов не существует, он их создаст, то есть скопирует.

-pogtEtv - просто набор параметров для сохранения метаданных файла, плюс v - подробный и r - рекурсивный

--progress - показывать прогресс синхронизации в реальном времени - очень полезно, если вы копируете большие файлы

--bwlimit=2000 - устанавливает максимальную скорость копирования / синхронизации (bw = пропускная способность)

PS rsync критически важен, когда вы работаете по сети. В случае локальной машины вы можете использовать такие команды, как cp .

Удачи!


0

Я использую rsyncс inotifywait. Когда вы измените любой файл, rsyncон будет выполнен.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Вам нужно запустить inotifywaitна обоих хостах. Пожалуйста, проверьте пример inotifywait


0

Что вам нужно, так это Rclone . Rclone («rsync для облачного хранилища») - это программа Linux из командной строки для синхронизации файлов и каталогов с разными поставщиками облачных хранилищ (Box, Dropbox, ftp и т. Д.) И локальными файловыми системами. Rlone поддерживает только зеркальную синхронизацию.

Другое более графическое решение, которое включает синхронизацию в реальном времени, - это использование FreeFileSync , который включает программу RealTimeSync. FreefileSync поддерживает двухстороннюю двунаправленную синхронизацию, которая включает обработку удалений.

Графический интерфейс FreFileSync


0

У меня был тот же вопрос, и я решил использовать git. Это может не соответствовать вашей ситуации, но если кто-то найдет эту тему и у вас возникнет такой же вопрос, вы можете подумать о системе контроля версий.

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