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


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

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

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

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

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


128
2018-06-03 03:53


происхождения




ответы:


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

rsync -avh source/ dest/ --delete

146
2017-08-26 07:14



Возможно, используя -aqr вместо этого тоже будет идея :) - TheBicentennialMan
Убедитесь, что источником является каталог. С помощью source/* dest/ не будет работать. - Tom Saleeba
Я нашел это событие с --delete или --delete-after он не будет удален из-за некоторых ошибок: «Ошибка ввода-вывода - пропущение удаления файла». Чтобы разрешить это добавление --ignore-errors вариант и отладить ошибки отдельно - MHT
Работает отлично! Несмотря на то, что он работает, я бы рекомендовал ВСЕГДА использовать -n, --dry-run перед запуском rsync, особенно когда дело доходит до таких вариантов, как эти (--delete). Это позволит избежать любой возможной головной боли :). - ivanleoncz
@MHT: ответ не кажется полным без вашего комментария. - Lonnie Best


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 по 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} реализовать только в TARGET.


32
2018-06-03 04:13



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


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

  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

5
2017-07-29 12:12



Я думаю, что -W не позволяет копировать только инкрементные данные, а всегда копировать целые файлы. - Tulains Córdova
Я получил эту ошибку, выполнив эту команду: rsync: Failed to exec --delete-before: No such file or directory (2) - Jeff Tian