Я хотел бы использовать rsync, чтобы ...
- удалить файлы на принимающей стороне, которые также были удалены на отправляющей стороне
- не удалять другие файлы, находящиеся в каталоге rsynced на принимающей стороне
Например, допустим, у меня есть каталог local-src
:
ДО: local-src
локально содержит ...
a.txt
b.txt
c.txt
local-src
называется мой удаленный каталог, который я хочу синхронизировать с содержимым remote-src
.
ДО: remote-src
удаленно содержит ...
a.txt
b.txt
c.txt
d.txt
README.md
Допустим, я удаляю некоторые файлы в local-src
:
ПОСЛЕ МЕСТНОГО УДАЛЕНИЯ: local-src
локально содержит ...
c.txt
Как я могу использовать rsync таким образом, чтобы гарантировать, что файлы, удаленные в источнике, также будут удалены в месте назначения, но без удаления других файлов в месте назначения. Например, я хотел бы иметь следующее в пункте назначения:
ПОСЛЕ МЕСТНОГО УДАЛЕНИЯ: remote-src
удаленно содержит ...
c.txt
d.txt
README.md
То есть a.txt
и b.txt
удаленно удаляются так же, но d.txt
и README.txt
остаются одни.
Есть ли способ достичь этого с помощью rsync?
РЕДАКТИРОВАТЬ: кажется, вердикт, что это может быть невозможно с rsync. Меня спросили, зачем мне это нужно, чтобы проиллюстрировать мой вариант использования:
Допустим, у меня есть веб-сервер. На этом веб-сервере у меня есть несколько каталогов, скажем, у меня есть каталог A
и public_html
каталог, из которого обслуживается мой сайт. Допустим, у меня есть какой-то автоматизированный процесс, который создает файлы в каталоге A
. Я хотел бы Rsync (или синхронизация с помощью какого - либо другого инструмента) файлы , созданных или обновленных в A
в public_html
каталог, не удаляя другие произвольные файлы , которые могут быть в пределах public_html
. Я, конечно, не хочу, чтобы rsync случайно удалил мой сайт.
Если rsync не является инструментом для этой работы, знает ли кто-то еще, как я могу это сделать?
rsync
поскольку нет способа узнать, какие файлы уже находятся в удаленной папке. Вам может понадобиться найти другой инструмент.Ответы:
То, что вы хотите сделать, разумно, но использовать его
rsync
для этого не стоит. Так что ответ - нет .Причина проста: не
rsync
хранит историю того, что было в каждом каталоге, и не знает, что нужно удалить, а что нет. Не без дополнительной поддержки.Вы должны спросить себя, почему вы хотели бы сделать это
rsync
и сделать это более ясным. Есть другие программы, которые используютlibrsync1.so
более интеллектуальные.С ослабленными ограничениями, которые вам сами по себе не нужны
rsync
, вы можете взглянуть на rdiff-backup :Это показывает
xx
иyy
вb
.Это показывает
xx
иzz
вb
.rdiff-backup
также хранит каталогrdiff-backup-data
вb
так что вы можете откатить изменения, вы должны очистить это на регулярной основе с использованиемrdiff-backup
команд. (Пример с локальными файлами, показывающими, что дополнительные данные в целевом объекте не удаляются, но rdiff-backup также работает по сети).Другой альтернативой является настройка некоторой распределенной системы контроля версий (Mercurial, Bazaar, Git). Например, в случае с Mercurial у вас может быть скрипт (для этого я использую Makefile), который отправляет все изменения на сервер, а затем обновляет извлеченные файлы, игнорируя любые дополнительные файлы, которые находятся на удаленном сервере (но имеют не был поставлен под контроль ревизии).
На сервере вы бы сделали:
На клиенте:
Теперь, если вы удалите файл на клиенте и выполните:
Ваш удаленный файл удаляется на сервере, но любые другие данные (не добавленные в хранилище) не удаляются.
источник
A
, где какой-то процесс автоматизирован, и там автоматически создаются файлы. У меня есть веб-сервер, и я хотел бы, чтобы файлы внутри негоA
были синхронизированы сpublic_html
каталогом веб-сервера, разумеется, без удаления всего остального вpublic_html
папке веб-сервера. Если у кого-то есть идеи для достижения этого с помощью другого инструмента, это будет более чем приветствоваться. Я обновлю свой вопрос, чтобы отразить это.local-src
каталоге, без какого-либо процесса, наблюдающего за этим каталогом на предмет изменений. Может быть, это будет сложно.rsync
не является инструментом. Следует понимать , чтоsync
вrsync
происходит от синхронизации , и это не совсем то , что вы хотите сделать. При разработкеrsync
акцент был сделан на эффективную (минимизирующую) передачу данных. Другие инструменты, такие какrdiff-backup
(и, возможно,cvsup
), использовали свои методы для этого, но опираются на него с дополнительными функциями.Я не думаю, что это возможно без явного исключения файлов на принимающей стороне как часть команды rsync. См. Раздел справочной страницы для rsync: «ПРАВИЛА И УДАЛЕНИЕ».
источник
Если я правильно понял, это
--exclude
может быть то, что вы ищете:источник
У меня есть ответ на это. Я думаю, что это работает. И это работает для меня. Сначала вы должны
rsync
удалить файлы в локальные файлы. Тогда локальная сторона содержит все файлы.сейчас в местной части
Затем вы можете удалить файлы или делать все, что вы хотите. (В локальной части). В вашем вопросе вы удаляете эти файлы.
удаленные файлы
После этого вы можете
rsync
локальные файлы на удаленной стороне. Тогда обе стороны имеют одинаковые файлы.это дает
файлы на удаленной стороне и на локальной стороне. (При использовании
--delete
он удаляет другие файлы на удаленной стороне , которые не совпадают с локальной стороной ).источник