Попросити rsync видалити файли на стороні прийому, які не існують на стороні надсилання, за винятком на стороні, що приймає


29

Я прочитав ці теми:

Але, наскільки я можу сказати (можливо, я щось пропускаю), вони не охоплюють таке питання:

Як ви просите rsyncскопіювати файли та видалити ті, хто на приймальній стороні, які не існують на стороні надсилання, за винятком? (наприклад, не видаляйте сховище ртутних даних .hgна стороні, що приймає, навіть якщо на стороні відправлення немає сховища).

Одна можливість?

Позики з відповіді @Richard Holloway нижче. Скажіть, у мене є такий рядок:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Наскільки я розумію, цей рядок змусить би rsyncвидалити все на шляху отримання, який не існує на шляху відправки, за винятком тих речей, які відповідають dont_delete_me. Моє запитання зараз: Чи буде rsync зберігати файли на приймальній стороні, які відповідають, dont_delete_me навіть якщо нічого на стороні відправки не збігається dont_delete_me?

Відповіді:


33

Якщо ви використовуєте --deleteі --excludeразом , що в виключеному місцезнаходження сайту не видаляються , навіть якщо вихідні файли будуть видалені.

Але це ставить питання про те, що папка взагалі не буде rsync. Отже, вам знадобиться інша rsyncробота в syncцій папці.

Напр.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Ви можете запустити їх навпаки, але тоді вони видалили б усі видалені файли, а потім замінили їх, що не так ефективно.

Ви не можете зробити це як один лайнер.


Дякую @Richard. Ваша відповідь змушує мене думати, що моє первісне запитання могло бути простіше, ніж я думав. Якщо я використовую єдиний рядок: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathчи не змусить це rsyncвидалити все на шляху отримання, що не існує на шляху відправки, крім речей, які відповідають dont_delete_me? Найголовніше, чи rsyncпідтримуватимуть речі на стороні, що приймає, dont_delete_me навіть якщо нічого на матчі сторони, що надсилає, нічого не будеdont_delete_me ? Якщо це так, я думаю, що це єдиний рядок, який мені потрібен, правда?
Амеліо Васкес-Рейна

Ви праві, але ви також не отримаєте нові файли та зміни в папці dont_delete_me, якщо ви будете робити це в одному рядку. Якщо ви не хочете синхронізувати зміни та доповнення, ви можете просто використовувати прапор --exclude, як ви описали тут.
Річард Холлоуей

@AmV Виключені файли не видаляються --delete, якщо ви чітко не вказали --delete-excluded. Дивіться опис посібника з rsync --deleteта --delete-excludedв ньому.
Жил 'SO- перестань бути злим'

4

Я виявив, що таке рішення працює для моїх цілей:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Примітка. Додайте -nопцію зробити пробіг, і не змінювати --deleteна --delete-excluded!)

Запуск команди викликає такі властивості:

  • Каталог джерел srcзалишається незмінним
  • Цільова destпапка відповідає папці-джерелу за винятком цього:

    • елементи зі do_not_send_to_destсписку не надсилаються до пункту призначення, і
    • елементи у do_not_modify_in_destсписку залишаються незмінними у пункті призначення.
  • (Примітка. Неіснуючі елементи перелічуються в жодному з " do_not_" файлів.)

Пояснення

Я думаю, що rsync читає аргументи командного рядка зліва направо, --deleteздається , що аргумент викликає rsync внутрішньо "перемикання режимів" (в певному сенсі), дозволяючи --exclude-fromзнову використовувати параметр, але з іншим значенням.

Caveat:

  • Якщо елемент у do_not_send_to_destсписку вже існує в пункті призначення, то:

    • ця команда не видаляє цей елемент з пункту призначення (якщо елемент вперше не видалено з вихідного каталогу)
    • Увага: зміни --deleteв --delete-excludedвидалить все в пункті призначення , який вказаний на будь-якому з ваших двох списків. xD (Можливо, rsync написано відкритим / гнучким, але має деякі з нюансами?)

Легко перевірено використання.

Я використовую " rsync version 3.0.9 protocol version 30".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.