Как заставить rsync удалять файлы, которые были удалены из исходной папки?

195

Недавно я настроил компьютер с Ubuntu Server для размещения игровых серверов. Я установил плагин резервного копирования для каждого игрового сервера, который создает частые резервные копии файлов игрового мира в определенной папке на компьютере. Я также cronпоставил задачу автоматически копировать эти резервные копии в папку Dropbox каждую ночь, используя rsync с этой -aопцией.

Через несколько месяцев моя учетная запись Dropbox достигла лимита хранилища, и я понял, что не смогу хранить столько резервных копий, поэтому я настроил плагин резервного копирования игрового сервера так, чтобы он не сохранял так много резервных копий, а затем несколько дней ждал, будет ли он удалите старые резервные копии, как это запланировано делать еженедельно. Плагин резервного копирования в конце концов выполнил свою работу и удалил старые резервные копии, поэтому я ожидал, что rsyncзадача cron впоследствии удалит более старые резервные копии из моей папки Dropbox, чтобы они соответствовали исходной папке, но этого не произошло. Итак, у меня есть пара вопросов:

  • По умолчанию добавляются ли в целевую папку rsyncтолько те файлы, которые были добавлены в исходную папку, и изменяются файлы, которые были изменены в исходной папке, но НЕ удаляются файлы, которые были удалены из исходной папки?

  • Если это так, каков наилучший способ сделать rsyncэто? Я хочу, чтобы папка назначения полностью отражала исходную папку, а это означает удаление любых файлов, которые были удалены из исходной папки.

Я вижу некоторые варианты, перечисленные на странице руководства, rsyncкоторые могут помочь, но я не знаком с этим.

user254251
источник

Ответы:

228

Чтобы удалить файлы в целевом объекте, добавьте --deleteпараметр в свою команду. Например:

rsync -avh source/ dest/ --delete
GarethD
источник
15
Убедитесь, что источником является каталог. Использование source/* dest/не будет работать.
Том Салиба,
3
Я обнаружил, что событие с --deleteили --delete-afterоно не будет удалено из-за некоторых ошибок: «Обнаружена ошибка ввода-вывода - пропуск удаления файла». Чтобы разрешить эту --ignore-errorsопцию добавления и отладить ошибки отдельно
MHT
12
Работает отлично! Несмотря на то, что он работает, я бы рекомендовал ВСЕГДА использовать -n, --dry-runпараметр, прежде чем запускать rsync, особенно когда речь идет о параметрах, подобных этим ( --delete). Это позволит избежать любой возможной головной боли :).
ivanleoncz
2
@ МХТ: Ни один ответ не будет полным без вашего комментария.
Лонни Бест
2
@TheBicentennialMan -a подразумевает -r .
x-yuri
45

Команда rsync не удаляет любой файл, пока вы используете некоторые из его параметров deleteв этой команде. Таким образом, если какой-либо файл или папка добавлены в исходный код, он будет синхронизирован с целевым без удаления.

Я предлагаю вам использовать rsyncдля создания резервной копии из исходных файлов и использовать find ... rmдля удаления файлов на период времени или размер файлов:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Приведенный выше блок кода создает резервную копию из исходного кода, а затем удаляет все файлы, время последнего изменения которых превышает 2 месяца.

ОБНОВИТЬ

Поскольку я считаю, что deleteпараметры предназначены только для TARGET, если некоторые файлы будут удалены из источника, rsync --deleteудалите их из TARGET. И deleteопция by afterи before, как упомянуто на его странице руководства :

--delete-before         receiver deletes before transfer, not during

Значит это:

  1. rsync удаляет файл из TARGET, который удаляется из SOURCE.
  2. rsync начать синхронизацию файлов.

--delete-after receiver deletes after transfer, not during

Значит это:

  1. rsync начать синхронизацию файлов.
  2. rsync удаляет файл из TARGET, который удаляется из SOURCE после синхронизации.

ПРИМЕЧАНИЕ : --delete-{before/after}навесное оборудование просто в ЗАДАЧЕ.

shgnInc
источник
1
Спасибо за ответ!! Вы имеете в виду опцию «удалить» для rsync? Почему я не могу просто использовать опцию «удалить» для rsync?
user254251
@ user254251, если вы используете delete, команда rsync немедленно удалит файлы. Но в этом случае больше времени для любых ошибок.
shgnInc
Если я правильно понимаю, вы говорите, что я должен отделить задачу удаления от задачи rsync, чтобы избежать ошибок. У меня есть вопрос, хотя. На странице руководства для rsync перечислены некоторые параметры, которые, по-видимому, служат для разделения задачи удаления путем ее запуска до или после задачи копирования. Например, я вижу две опции: --delete-before и --delete-after. Будет ли rsync с этими параметрами иметь тот же эффект, что и описанный вами метод? Я прочитал полное описание каждой опции на странице руководства, но в описаниях есть некоторая информация, которую я не понимаю.
user254251
@ user254251, Ответ обновлен. Я не знаю, есть ли способ удалить файлы из TARGET по ограничению времени в rsync .
shgnInc
Спасибо! Так что вы думаете, что я в безопасности от ошибок, если я просто использую опцию --delete-before? Я не указываю время ожидания, поэтому мне не нужно беспокоиться, если этап удаления rsync задерживает этап передачи. rsync запускается один раз в день, и у вас достаточно времени для синхронизации файлов резервных копий перед следующей синхронизацией, поэтому мне не нужно ограничивать время синхронизации.
user254251
6

Эта команда скопирует инкрементные данные и синхронизирует их с удаленным сервером.

  1. Он будет копировать только дополнительные данные.
  2. Он будет удален, если какие-либо данные удалены из источника.
  3. Он скопирует снова из источника, если какие-либо данные были удалены в месте назначения.
  4. в основном эта команда будет синхронизировать обе среды.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Пример:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup
Ганеш Губе
источник
2
Я думаю, что -W позволяет не копировать только инкрементные данные, а всегда копировать целые файлы.
Тулаинс Кордова
Я получил эту ошибку, выполнив эту команду: rsync: Failed to exec --delete-before: No such file or directory (2)
Джефф Тиан
1

Если во время rsync scync возникнут какие-либо ошибки, rsync не удалит файлы должным образом, даже если вы использовали --delete , --delete-afterили --delete-before.

Вот почему так важно исправлять ошибки rsync.

Большинство моих ошибок было связано с использованием этой --permsопции при синхронизации с файловой системой не-Linux. Когда я заменил --permsна--no-perms , эти ошибки ушли, а затем удаление сработало.

--permsЭто нормально, когда вы синхронизируете из файловой системы Linux с другой файловой системой Linux, но если вы синхронизируете из Linux с файловой системой не-Linux (например, NTFS, FAT), это --permsвызывает ошибки, потому что rsync не может установить разрешения Linux для не Linux-файловые системы . Опять же, ошибки = нет удаления.

- При синхронизации с разделом, отличным от Linux, я использую, --no-permsчтобы избежать тех ошибок, которые саботируют --delete,--delete-after или --delete-before.

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

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Команда выше удалит вещи, которые не синхронизированы, но не синхронизируют файлы. Итак, вы должны синхронизироваться снова после этого. Эта команда основана на этом ответе , за исключением того, что я также добавил --ignore-errorsаргумент, поэтому он будет удален, даже если есть ошибки.

Лонни Бест
источник
1
Спасибо за чаевые! Я являюсь автором этого вопроса 5 лет назад. Я очень рад, что вы опубликовали это, потому что я планировал настроить синхронизацию с диском NTFS в ближайшем будущем, и я, вероятно, столкнулся бы с ошибкой разрешений, потому что я планировал использовать опцию "-a" для rsync, который синхронизирует разрешения (между прочим). Поэтому я добавил «--no-perms» в свои заметки. Теперь я планирую использовать rsync -a --no-perms --delete-before. У меня есть вопрос: не будет ли --delete-before избежать проблем с удалением файлов, запустив удаление перед синхронизацией? Думал, что это было его целью.
user254251
@ user254251 - Я не уверен. Я предполагаю, что это будет зависеть от того, как рано это действительно "удаляет прежде". Если он каким-то образом сталкивается с одной ошибкой до того, как начинается удаление, ваш винт. Я советую вам избегать NTFS в любое время, если вы не любите острые боли в заднице :). NTFS to NTFS работает нормально. NTFS в Linix работает нормально. Избегайте «Файловая система Linux» в «Файловая система не Linux»; это слишком большая боль, чтобы гарантировать правильное удаление работ. Вы МОЖЕТЕ сделать это, но я решил, что это не стоит проблем, по сравнению с простым форматированием диска назначения как EXT4.
Лонни Бест