Як зробити так, щоб rsync видалив файли, видалені з вихідної папки?


194

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

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

  • За замовчуванням, це rsyncтільки додати файли в папку призначення , які були додані в вихідну папку і змінити файли , які були змінені в вихідної папці , але не видаляйте файли , які були видалені з вихідної папки?

  • Якщо це так, то який найкращий спосіб зробити rsyncце? Я хочу, щоб цільова папка чудово відображала вихідну папку, а це означає видалення будь-яких файлів, видалених із вихідної папки.

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

Відповіді:


227

Щоб видалити файли в цілі, додайте --deleteпараметр до своєї команди. Наприклад:

rsync -avh source/ dest/ --delete

15
Переконайтесь, що джерелом є каталог. Використання source/* dest/не вийде.
Том Салееба

3
Я виявив, що ця подія з --deleteабо --delete-afterне буде видалена через деякі помилки: "Виникла помилка вводу- виводу - пропуск видалення файлу". Щоб вирішити цю --ignore-errorsопцію додавання та відладкуйте помилки окремо
MHT

12
Працює чудово! Хоча він працює, я б рекомендував ЗАВЖДИ використовувати -n, --dry-runопцію перед запуском rsync, особливо якщо мова йде про такі параметри, як ці ( --delete). Це дозволить уникнути будь-якого можливого головного болю :).
ivanleoncz

2
@MHT: Жодна відповідь, здається, не завершена без вашого коментаря.
Lonnie Best

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варіант за 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.


1
Дякую за відповідь!! Ви посилаєтесь на параметр "видалити" для rsync? Чому я не можу просто скористатися параметром "видалити" для rsync?
користувач254251

@ user254251, Якщо ви використовуєте delete, команда rsync негайно видаляє файли. Але в цьому випадку є більше часу для будь-яких помилок.
shgnInc

Якщо я правильно розумію, ви говорите, що я повинен відокремити завдання видалення від завдання rsync, щоб уникнути помилок. Однак у мене є питання. На сторінці посібника для rsync перераховані деякі параметри, які, як видається, служать меті відокремити завдання видалення, виконавши її до або після завдання копіювання. Наприклад, я бачу два варіанти, які називаються --delete-before та --delete-after. Чи матиме rsync ці параметри такий же ефект, як описаний вами метод? Я читаю повний опис кожного варіанту на сторінці керівництва, але є деяка інформація в описах, яку я не розумію.
користувач254251

@ user254251, Відповідь було оновлено. Я не знаю, чи є спосіб видалити файли з TARGET обмеженням часу в rsync .
shgnInc

Дякую! Отже, ви вважаєте, що я захищений від помилок, якщо просто використовую параметр --delete-before? Я не вказую тайм-аут, тому я не повинен турбуватися, якщо етап видалення rsync затримує етап передачі. rsync працює один раз на день, і це достатньо часу для синхронізації файлів резервного копіювання до наступної синхронізації, тому мені також не потрібно обмежувати синхронізацію.
користувач254251

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 дозволяє не копіювати лише окремі дані, а завжди копіювати цілі файли.
Tulains Córdova

Я отримав цю помилку, виконуючи цю команду: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

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 на нелінуксні файлові системи . Знову помилки = без видалення.

- При синхронізації в розділі Non-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, який синхронізує дозволи (серед іншого). Тож я додав до нотаток "- perms". Зараз я планую використовувати rsync -a --no-perms --delete-раніше. У мене виникає питання: не вдалося б - видалити-раніше, щоб уникнути проблем зі видаленням файлів, запустивши видалення до синхронізації? Думав, що це було його метою.
користувач254251

@ user254251 - я не впевнений. Я думаю, це залежало б від того, наскільки рано воно справді "видаляється раніше". Якщо це дещо, як виникає одна помилка перед початком видалення, ваш викрутили. Моя рада вам - уникати NTFS в будь-який час, якщо не можете, якщо вам не подобаються різкі болі в попці :). Від NTFS до NTFS працює чудово. NTFS для Linix працює чудово. Уникайте "Файлової системи Linux" до "Файлової системи, яка не є Linux"; це занадто багато болю, щоб забезпечити правильне видалення творів. Ви МОЖЕТЕ це зробити, але я вирішив, що не варто проблем, а просто форматування накопичувача як EXT4.
Lonnie Best
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.