Как заставить rsync удалять файлы в целевой папке, которые были удалены в источнике, с помощью шаблонов оболочки?

Вопрос или проблема

Я пытаюсь периодически собирать файлы из нескольких источников в один файл назначения.
Чтобы сохранить копии, я попробовал использовать rsync, но у меня возникли небольшие проблемы.
Допустим, я хочу скопировать некоторые файлы из папок:

"/var/log/dir2/*.cert",
"/var/log/dir1",

Дело в том, что, допустим, /var/log/dir2 содержит 2 сертификата (file1, file2). Я синхронизировал их один раз:

 rsync -av /var/log/dir2/*.cert  /tmp/dest --delete-before

Отлично, теперь в dest есть file1.cert и file2.cert.
Теперь:

rm /var/log/dir2/file1.cert

синхронизируем снова:

rsync -av /var/log/dir2/*.cert  /tmp/dest --delete-before

Я ожидал, что в dest останется только file2.cert, а file1.cert будет удален, как в исходной папке, но этого не происходит.. почему? Как я могу сделать так, чтобы это работало?

Опция delete-before должна работать, когда вы синхронизируете папки, а не отдельные файлы.

Если вы попробуете:

rsync -av /var/log/dir2/  /tmp/dest --delete-before

Я подозреваю, что это сработает так, как вы предполагаете.

Ответ или решение

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

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

Ваша проблема связана с тем, что при использовании шаблонов glob (например, *.cert) с rsync, команда не воспринимает файлы как часть каталога и, следовательно, не может корректно удалить их в целевой папке, если они удалены в источнике.

Проблема:

При использовании rsync -av /var/log/dir2/*.cert /tmp/dest --delete-before вы сталкиваетесь с тем, что удаленные в источнике файлы (например, file1.cert) не убираются из целевой директории /tmp/dest. Это происходит потому, что rsync работает с конкретными файлами, а не с папками, и не может сопоставить удаленные файлы в целевой папке.

Решение:

Для правильной работы с удалением файлов рекомендую использовать синхронизацию папки целиком, а не отдельных файлов. Это достигается путем указания директории без использования шаблонов glob. Вот как это можно сделать:

  1. Синхронизация каталога целиком:

    Вместо того чтобы использовать:

    rsync -av /var/log/dir2/*.cert /tmp/dest --delete-before

    Используйте:

    rsync -av /var/log/dir2/ /tmp/dest --delete-before

    В этом случае rsync будет рассматривать все файлы в /var/log/dir2/, включая их структуру.

  2. Фильтрация файлов:

    Если вам необходимо синхронизировать только определенные файлы (например, только файлы с расширением .cert), вы можете использовать параметр --include и --exclude, чтобы гарантировать, что только нужные файлы будут скопированы и правильно удалены:

    rsync -av --include='*.cert' --exclude='*' /var/log/dir2/ /tmp/dest --delete-before

    В этом случае rsync сначала обрабатывает удаление, а потом копирует только те файлы, которые вы хотите оставить.

Заключение:

Использование rsync для синхронизации определенных файлов требует тщательного подхода к обработке каталогов. Смена с использования шаблонов glob на полные пути каталогов позволяет утилите более корректно обрабатывать операции удаления и синхронизации. Следуя представленным рекомендациям, вы сможете добиться требуемого результата, сохранять актуальность данных и избегать ситуации с нежелательными файлами в целевой директории.

Это решение обеспечит надёжный механизм резервного копирования и синхронизации с правильной обработкой удалённых файлов, что особенно важно при периодических обновлениях данных.

Оцените материал
Добавить комментарий

Капча загружается...