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

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

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

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


person java.is.for.desktop    schedule 21.10.2009    source источник
comment
Я считаю, что на serverfault.com вы получите более точные ответы.   -  person Esteban Küber    schedule 21.10.2009


Ответы (8)


Просто запустите его дважды, используя «новый» режим (флаг -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

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

person jsight    schedule 21.10.2009
comment
Поскольку вопрос касался rsync, отмечу этот ответ как правильный. - person java.is.for.desktop; 27.10.2009
comment
Но вы спрашивали и о других решениях, и Unison работает лучше, иначе я бы никогда не упомянул другой инструмент. Я понимаю, что у вас, возможно, есть особые обстоятельства, которые способствуют использованию rsync. - person MaD70; 27.10.2009
comment
Блин, ты получил 6 голосов и все еще жалуешься? ‹J / k› Unison - действительно интересное решение, и я рад, что вы упомянули его. :) - person jsight; 28.10.2009
comment
Ну я не жалуюсь, я объясняю. Просто чтобы убедиться, что я чего-то не упускаю (не являюсь носителем английского языка). - person MaD70; 30.10.2009
comment
MaD70 - Без проблем ... Я пошутил. :) - person jsight; 02.11.2009
comment
Использование -t (--times) весьма актуально при двусторонней синхронизации, иначе придется каждый раз перепроверять файлы. - person fiddur; 24.03.2013
comment
как преобразовать этот 'rsync -a -vv ..' | grep -v 'uptodate'? rsync -rtu -vv .. | grep -v 'uptodate'? - person stackdave; 10.01.2018
comment
Я бы хотел, чтобы кто-нибудь мог создать псевдоним Bash, чтобы сделать это всего одной командой. например rsync -b arg1 arg2 для синхронизации в обоих направлениях со всеми хорошими параметрами, включенными в rsync. - person Foad; 29.01.2018

Знаете ли вы Unison File Synchronizer?

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

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

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

person MaD70    schedule 21.10.2009
comment
+1. Унисон - лучший способ сделать это. Double-rsync сложно понять, и он вообще не обрабатывает удаления. - person Avdi; 21.10.2009
comment
Да, Unison устойчив к ошибкам. Я обновляю свой ответ, чтобы подчеркнуть это. - person MaD70; 21.10.2009
comment
Не слышал об Унисоне. Вы должны заставить меня переделать мои сценарии резервного копирования сегодня дома. - person Esteban Küber; 21.10.2009
comment
Я рад, что мой ответ настолько полезен (это показывает, насколько практичным может быть инструмент, основанный на прочной теоретической основе). - person MaD70; 21.10.2009
comment
Вот краткое руководство по Unison на linuxjournal. - person lepe; 05.09.2014
comment
Для ответа rsync была дана фактическая команда. Было бы полезно, если бы для унисона вы предоставили некоторые пояснения о том, как выполнять синхронизацию, помимо скопированного и вставленного описания программного обеспечения. - person user1271772; 08.03.2020

Вам нужно запустить 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, который проведет вас через создание такого скрипта.

person Mecki    schedule 31.12.2019
comment
Красиво поставлен. - person Peter Rowntree; 15.05.2020

Спасибо 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
person Mayank Agarwal    schedule 18.01.2013
comment
Просто интересно, должен ли я добавить -t, чтобы скопировать время изменения файла. Есть ли причина, по которой я должен уйти? - person chrips; 15.10.2018
comment
@Chrips Нет, я так не думаю. Похоже, что цель этого ответа состояла в том, чтобы просто показать, что вы можете использовать && между двумя командами для автоматического запуска 2-й команды сразу после 1-й команды (если 1-я команда успешна), а не вручную запускать одну за другой как в ответе @jsight. Кроме того, я думаю, что ответ @ jsight был отредактирован, чтобы включить параметр -t после того, как этот ответ был опубликован. - person Ruben9922; 08.03.2019

Используйте 1_

Например:

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

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

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

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

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

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

Удачи!

person Bohdan    schedule 15.03.2013

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

person sgon00    schedule 29.11.2020

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

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

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

person iadd    schedule 10.08.2018

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

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

FreFileSync gui

person user1461607    schedule 19.02.2019