Вопрос или проблема
Я пытаюсь периодически собирать файлы из нескольких источников в один файл назначения.
Чтобы сохранить копии, я попробовал использовать 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. Вот как это можно сделать:
-
Синхронизация каталога целиком:
Вместо того чтобы использовать:
rsync -av /var/log/dir2/*.cert /tmp/dest --delete-before
Используйте:
rsync -av /var/log/dir2/ /tmp/dest --delete-before
В этом случае
rsync
будет рассматривать все файлы в/var/log/dir2/
, включая их структуру. -
Фильтрация файлов:
Если вам необходимо синхронизировать только определенные файлы (например, только файлы с расширением
.cert
), вы можете использовать параметр--include
и--exclude
, чтобы гарантировать, что только нужные файлы будут скопированы и правильно удалены:rsync -av --include='*.cert' --exclude='*' /var/log/dir2/ /tmp/dest --delete-before
В этом случае
rsync
сначала обрабатывает удаление, а потом копирует только те файлы, которые вы хотите оставить.
Заключение:
Использование rsync
для синхронизации определенных файлов требует тщательного подхода к обработке каталогов. Смена с использования шаблонов glob на полные пути каталогов позволяет утилите более корректно обрабатывать операции удаления и синхронизации. Следуя представленным рекомендациям, вы сможете добиться требуемого результата, сохранять актуальность данных и избегать ситуации с нежелательными файлами в целевой директории.
Это решение обеспечит надёжный механизм резервного копирования и синхронизации с правильной обработкой удалённых файлов, что особенно важно при периодических обновлениях данных.