Как исключить файлы в rsync?

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

Я использую ubuntu server 12.04, теперь я хочу сделать резервную копию некоторых файлов, используя rsync, вот попытка:

rsync -aAX $HOME/Documents/* $HOME/Backups/TEST --exclude={$HOME/Documents/another/*,$HOME/Documents/temp/*} 

Как вы видите, я хочу сделать копию всех файлов в папке $HOME/Documents в папку $HOME/Backups/TEST, но исключить файлы в папке another и temp. Но я потерпел неудачу, rsync все равно скопировал файлы из обеих исключенных папок:

ls $HOME/Backups/TEST/another
test

test — это файл в папке another, и он также скопирован, хотя я исключил файл в rsync, почему? Как сделать так, чтобы эти файлы действительно исключались?

Вам может быть проще добавить файлы .rsync-filter в ваши исходные каталоги и использовать опцию -F.

Из руководства:

-F: Опция -F является сокращением для этого правила:

 --filter="dir-merge /.rsync-filter"

Это указывает rsync искать файлы .rsync-filter в каталоге, которые встречаются в иерархии, и использовать их правила для фильтрации файлов при передаче.

Например: в $HOME/Documents/.rsync-filter

# вы можете добавлять комментарии в файлы фильтров

- /another/
- /temp/

Вместо - вы также можете написать целое слово exclude.

Теперь вы можете

rsync -aAX -F $HOME/Documents/ $HOME/Backups/TEST/

С вашим rsync-командой есть несколько проблем (также смотрите руководство для rsync для подробного объяснения правил фильтрации).

  • нам нужна команда --exclude для каждого заданного шаблона.
  • указанные пути должны быть относительно исходного пути (не абсолютные пути).
  • опции должны быть указаны до указания источника и места назначения.

Для вашего примера следующая синтаксис будет работать:

rsync -avAX --exclude=another/ --exclude=temp/ ~/Documents/ ~/Backups/TEST

Учтите, что если шаблон исключения заканчивается на /, это относится к каталогу. Если вы пропустите это, будут исключены как файлы, так и каталоги с таким названием. Замените его на подстановочный знак *, чтобы исключить все файлы или каталоги с этой строкой в их именах.

Я бы предложил, следуя документации:

rsync -aAX --exclude={/another,/temp} $HOME/Documents/ $HOME/Backups/TEST

Ваше использование фигурных скобок корректно в bash, так как это расширяется до “–exclude=/another –exclude=/temp”.

Путь в исключениях является относительным по отношению к источнику $HOME/Documents/, даже если он начинается с “/”, таким образом –exclude=/another исключает $HOME/Documents/another. Однако, если в начале нет “/” –exclude=another, то она пропускает все каталоги с именем “another” также в других частях дерева, например, $HOME/Documents/yet/another.

Однако с дополнительной опцией –delete это не удаляет содержимое $HOME/Backups/TEST/another или $HOME/Backups/TEST/temp, как только там что-то появится. Он просто оставляет его неизменным.

Символ / в конце исходного каталога $HOME/Documents/ имеет особое значение; если его убрать, внутри целевого каталога $HOME/Backups/TEST будет создан новый каталог $HOME/Backups/TEST/Documents. Если символ / есть, содержимое $HOME/Documents будет скопировано непосредственно в $HOME/Backups/TEST.

Я согласен, что это может быть не совсем интуитивно понятно.

.

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

Для того чтобы исключить определённые файлы или папки при копировании данных с помощью утилиты rsync, необходимо правильно использовать опцию --exclude. Давайте разберём, как это сделать корректно и какие ошибки могут возникнуть при неправильном использовании.

Теория (Theory)

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

Одной из востребованных функций rsync является возможность исключения определённых файлов или директорий из процесса синхронизации. Это реализуется при помощи опции --exclude, которая может быть использована многократно, чтобы исключить разные файлы или папки. Шаблоны для исключения могут быть довольно гибкими и пригодными как для указаний на конкретные файлы, так и для более общих паттернов.

Пример (Example)

Рассмотрим ваш пример:

Вы пытались выполнить следующую команду:

rsync -aAX $HOME/Documents/* $HOME/Backups/TEST --exclude={$HOME/Documents/another/*,$HOME/Documents/temp/*}

Есть несколько причин, почему указанная команда не выполнит задуманное:

  1. Неправильное положение опций: Опции должны указываться перед указанием путей источника и назначения, например, после rsync и до первого пути.

  2. Пути исключений: rsync ожидает, что пути будут указаны относительно исходного каталога. В вашем случае, источник — это $HOME/Documents/, и следовательно, пути исключений должны быть указаны относительно этой папки, то есть следует использовать --exclude=another/ и --exclude=temp/ вместо абсолютных.

  3. Структура каталогов: Изучите использование закрывающего символа / в конце пути исключения. Если путь заканчивается на /, это указывает на исключение каталога, а не просто файла.

  4. Использование фигурных скобок: Bash-расширение фигурных скобок должно быть корректным. Вы можете писать {dir1,dir2} для исключения нескольких директорий, но в контексте rsync всё же предпочтительно указать каждое исключение отдельно через --exclude.

Корректная команда может выглядеть так:
rsync -aAX --exclude=another/ --exclude=temp/ $HOME/Documents/ $HOME/Backups/TEST

Применение (Application)

При выполнении резервного копирования в вашей системе стоит следовать следующим принципам и рекомендациям:

  1. Понимание относительных путей: Всегда проверяйте, что пути, которые вы указываете в --exclude, правильные и указаны относительно исходного каталога. Если вы синхронизируете $HOME/Documents/, исключения должны относиться к этой директории.

  2. Использование конфигурационных файлов: Вы можете упростить себе задачу использованием файлов .rsync-filter, которые содержат списки исключений, и управлять ими проще. Файл фильтра может быть в формате:

    # комментарии
    - /another/
    - /temp/

    И затем использовать опцию -F, которая автоматически применит эти правила:

    rsync -aAX -F $HOME/Documents/ $HOME/Backups/TEST/
  3. Проверка синхронизации: Запустите rsync с опцией --dry-run, чтобы симулировать процесс копирования. Это позволяет проверить, какие файлы будут скопированы, а какие исключены, без фактической передачи данных.

  4. Система создания резервных копий: Разработайте план регулярного создания резервных копий, чтобы важные данные были защищены. Используйте скрипты и планировщики задач, такие как cron, для автоматизации процесса.

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

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

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