Как можно использовать rsync для синхронизации из файла и удаления лишних файлов/каталогов на целевом месте?

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

При использовании 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/

Пояснение команд

  1. –dry-run: Этот параметр позволяет вам предварительно просмотреть изменения, не внося их. Это полезно для тестирования команд.

  2. –itemize-changes: Этот флаг инструктирует rsync выводить информацию о том, какие изменения будут сделаны.

  3. –delete: Этот флаг активирует удаление файлов на стороне назначения, которые отсутствуют в списке.

  4. –recursive: Указывает, что rsync должен обрабатывать директории рекурсивно.

  5. –include-from: Указывает файл, содержащий список файлов/директорий, которые необходимо учитывать.

  6. **–exclude***: Все файлы, не указанные в include-from, будут исключены из синхронизации.

  7. Пути к директориям: Важно, чтобы путь к директории источника (/tmp/sync/left/) и к директории назначения (/tmp/sync/right/) был указан правильно. Это гарантирует, что rsync правильно сопоставляет файлы в структуре каталогов.

Заключение

Учитывая все вышеперечисленное, вы сможете успешно настроить rsync для синхронизации выбранных файлов и удаления лишних на стороне назначения. Протестируйте команду с параметром --dry-run, чтобы убедиться, что она работает так, как вы ожидаете, прежде чем выполнять фактическую синхронизацию. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!

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

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