Я хочу использовать rsync для синхронизации двух каталогов в обоих направлениях.
Я имею в виду синхронизацию в классическом смысле ( не так, как это подразумевается в руководствах по rsync):
я хочу обновлять каталоги в обоих направлениях , в зависимости от того, какой из них новее .
Можно ли это сделать с помощью rsync (желательно в Linux) ?
Если нет, то какие еще существуют решения?
Ответы:
Просто запустите его дважды, используя «новый» режим (флаг -u или --update) плюс -t (для копирования времени изменения файла), -r (для рекурсивных папок) и -v (для подробного вывода, чтобы увидеть, что это такое. делаю):
Это не будет обрабатывать удаления, но я не уверен, что есть хорошее решение этой проблемы с помощью только периодической синхронизации.
источник
Вы знаете Unison File Synchronizer ?
Также обратите внимание, что он устойчив к сбоям:
источник
Вам нужно запустить
rsync
дважды, и я рекомендую запустить его с помощью-au
:-a
(a для архива) - это ярлык для-rlptgoD
:-r
Рекурсия в подкаталоги-l
Также синхронизировать символические ссылки-p
Также синхронизировать права доступа к файлам-t
Также синхронизировать время модификации файла-g
Также синхронизировать группы файлов-o
Также синхронизировать владельца файла-D
Также синхронизировать специальные (не обычные / мета) файлыВ принципе, всякий раз, когда вы хотите создать идентичную копию один-к-одному
rsync
, вы всегда должны использовать это,-a
поскольку большинство пользователей ожидают этого, когда они говорят о « синхронизации ». Другие ответы здесь, похоже, упускают из виду, что иногда содержимое файла остается неизменным, но его владелец, возможно, изменился или его права доступа могли измениться, и в этом случаеrsync
не будет синхронизироваться файл, что может быть фатальным.Но вам также необходимо,
-u
поскольку это говорит о том,rsync
чтобы полностью оставить в покое любой файл / папку, если он уже существует в месте назначения и имеет более новую дату последнего изменения. Без-u
rsync
синхронизации будет выполняться независимо от того, является ли файл / папка более новым или нет .Обратите внимание, что это решение не может обрабатывать удаленные файлы. Обработка удалений не является простой возможной, поскольку рассмотрим следующую ситуацию: файл был удален в источнике, теперь как
rsync
узнать, существовал ли этот файл когда-то и был ли удален (в этом случае он должен быть удален и в месте назначения) или он никогда не существовал в источнике (в этом случае он должен быть скопирован из места назначения). Эти две ситуации выглядят одинаково,rsync
поэтому он не может знать, как правильно реагировать. Синхронизация наоборот не поможет, поскольку это может привести к той же ситуации: файл существует в источнике, но не в месте назначения. Почему? Он никогда не существовал в месте назначения или был удален? Оба случая выглядят одинаковоrsync
.Инструменты синхронизации, которые могут надежно синхронизировать удаленные файлы, обычно ведут журнал синхронизации обо всех прошлых операциях синхронизации. Если этот журнал показывает, что когда-то был файл и был синхронизирован, но теперь он отсутствует, очевидно, что он был удален. Если такого файла по журналу никогда не было, его необходимо синхронизировать. Сохраняя все записи журнала с отметками времени, даже возможно, что удаленный файл вернется и будет удален несколько раз, но инструмент синхронизации всегда будет знать, что делать, и результат всегда будет правильным.
rsync
не имеет такого журнала, он полагается только на текущее состояние файла двух сторон операции.Однако вы можете создать себе команду синхронизации, используя
rsync
небольшой сценарий оболочки POSIX, который уже очень близок к инструменту синхронизации, как описано выше. Поскольку мне сам был нужен такой инструмент, вот ответ на Stackoverflow, который проведет вас через создание такого скрипта.источник
Спасибо jsight
Это приведет к тому, что вторая синхронизация произойдет сразу после завершения первой. В случае, если структура каталогов огромна, это сэкономит время, так как не нужно сидеть перед компьютером. Если структура огромна, удалите подробности и прогресс.
источник
&&
между двумя командами для автоматического запуска 2-й команды сразу после 1-й команды (если 1-я команда успешна), а не вручную запускать одну за другой как в ответе @jsight. Кроме того, я думаю, что ответ @jsight был отредактирован, чтобы включить этот-t
параметр после публикации этого ответа.Использовать
rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir
например:
Синхронизирует xxx-файлы с разными-материалами / xxx-файлами. Если разных-файлов / xxx-файлов не существует, он их создаст, то есть скопирует.
-pogtEtv
- просто набор параметров для сохранения метаданных файла, плюс v - подробный и r - рекурсивный--progress
- показывать прогресс синхронизации в реальном времени - очень полезно, если вы копируете большие файлы--bwlimit=2000
- устанавливает максимальную скорость копирования / синхронизации (bw = пропускная способность)PS rsync критически важен, когда вы работаете по сети. В случае локальной машины вы можете использовать такие команды, как cp .
Удачи!
источник
Я использую
rsync
сinotifywait
. Когда вы измените любой файл,rsync
он будет выполнен.Вам нужно запустить
inotifywait
на обоих хостах. Пожалуйста, проверьте пример inotifywaitисточник
Что вам нужно, так это Rclone . Rclone («rsync для облачного хранилища») - это программа Linux из командной строки для синхронизации файлов и каталогов с разными поставщиками облачных хранилищ (Box, Dropbox, ftp и т. Д.) И локальными файловыми системами. Rlone поддерживает только зеркальную синхронизацию.
Другое более графическое решение, которое включает синхронизацию в реальном времени, - это использование FreeFileSync , который включает программу RealTimeSync. FreefileSync поддерживает двухстороннюю двунаправленную синхронизацию, которая включает обработку удалений.
источник
У меня был тот же вопрос, и я решил использовать
git
. Это может не соответствовать вашей ситуации, но если кто-то найдет эту тему и у вас возникнет такой же вопрос, вы можете подумать о системе контроля версий.источник