Вопрос или проблема
При использовании rsync --files-from=$FILE
я хотел бы удалить все файлы и каталоги в назначении, которые не указаны в файле.
Например
mkdir /tmp/sync
cd /tmp/sync
mkdir left right
touch left/only_left right/only_right
echo /tmp/sync/left/only_left > tosync
rsync \
--dry-run \
--itemize-changes \
--files-from=/tmp/sync/tosync \
--progress \
--human-readable \
--prune-empty-dirs \
--delete-after \
--inplace \
/ /tmp/sync/right/
выводит
cd+++++++++ tmp/
cd+++++++++ tmp/sync/
cd+++++++++ tmp/sync/left/
>f+++++++++ tmp/sync/left/only_left
и find /tmp/sync/right
выводит
find right/
right/
right/only_right
right/tmp
right/tmp/sync
right/tmp/sync/left
right/tmp/sync/left/only_left
Я тем не менее ожидаю, что “only_right” будет удален, но это не так. Как это работает?
rsync удалит только файлы назначения при рекурсивном сравнении содержимого каталогов.
Вам нужно, чтобы файлы в ‘tosync’ были относительными к исходному каталогу.
Исходя из вашего примера, чтобы получить нужное поведение, это работает:
echo 'only_left' > /tmp/sync/tosync
rsync --dry-run --itemize-changes \
--delete --recursive \
--include-from=/tmp/sync/tosync \
--exclude=* /tmp/sync/left/ /tmp/sync/right/
У меня есть похожая задача: синхронизировать файлы в списке и удалить файлы на стороне получения, которые больше не находятся в списке.
Я провел несколько часов на различных экспериментах и поиске решения в интернете, но так и не нашел работающего способа запустить rsync.
Скажите, что я делаю не так?
Команда:
rsync.exe –itemize-changes –files-from=1.txt –delete-excluded 192.168.1.1::backups /cygdrive/e/backupsdir/
Ответ или решение
Для эффективной синхронизации файлов и удаления избыточных файлов и директорий на стороне назначения с использованием rsync
, необходимо учитывать несколько ключевых аспектов команды, а также корректно задать параметры. Рассмотрим решение подробнее.
Проблема
Вы хотите синхронизировать файлы и директории, указанные в файле, с директорией назначения, при этом удаляя все файлы и директории, которые не входят в указанный список. Например, у вас есть файл tosync
, содержащий список файлов, которые должны быть скопированы.
Ваш первоначальный подход с использованием команды:
rsync --dry-run --itemize-changes --files-from=/tmp/sync/tosync --progress --human-readable --prune-empty-dirs --delete-after --inplace / /tmp/sync/right/
не работает так, как ожидалось, поскольку --files-from
ожидает относительные пути к файлам, и в данном случае rsync
не видит нужные файлы для удаления. Это объясняется тем, что команда rsync
удаляет только те файлы, которые находятся в директориях, которые он проверяет согласно относительным путям из tosync
.
Решение
Чтобы добиться нужного поведения, используем следующую команду:
# Создайте список файлов, который вы хотите синхронизировать
echo 'only_left' > /tmp/sync/tosync
# Запустите rsync с корректными параметрами и относительными путями
rsync --dry-run --itemize-changes \
--delete --recursive \
--include-from=/tmp/sync/tosync \
--exclude=* /tmp/sync/left/ /tmp/sync/right/
Пояснение команд
-
–dry-run: Этот параметр позволяет вам предварительно просмотреть изменения, не внося их. Это полезно для тестирования команд.
-
–itemize-changes: Этот флаг инструктирует
rsync
выводить информацию о том, какие изменения будут сделаны. -
–delete: Этот флаг активирует удаление файлов на стороне назначения, которые отсутствуют в списке.
-
–recursive: Указывает, что
rsync
должен обрабатывать директории рекурсивно. -
–include-from: Указывает файл, содержащий список файлов/директорий, которые необходимо учитывать.
-
**–exclude***: Все файлы, не указанные в
include-from
, будут исключены из синхронизации. -
Пути к директориям: Важно, чтобы путь к директории источника (
/tmp/sync/left/
) и к директории назначения (/tmp/sync/right/
) был указан правильно. Это гарантирует, чтоrsync
правильно сопоставляет файлы в структуре каталогов.
Заключение
Учитывая все вышеперечисленное, вы сможете успешно настроить rsync
для синхронизации выбранных файлов и удаления лишних на стороне назначения. Протестируйте команду с параметром --dry-run
, чтобы убедиться, что она работает так, как вы ожидаете, прежде чем выполнять фактическую синхронизацию. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!