Вопрос или проблема
Я использую 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/*}
Есть несколько причин, почему указанная команда не выполнит задуманное:
-
Неправильное положение опций: Опции должны указываться перед указанием путей источника и назначения, например, после
rsync
и до первого пути. -
Пути исключений:
rsync
ожидает, что пути будут указаны относительно исходного каталога. В вашем случае, источник — это$HOME/Documents/
, и следовательно, пути исключений должны быть указаны относительно этой папки, то есть следует использовать--exclude=another/
и--exclude=temp/
вместо абсолютных. -
Структура каталогов: Изучите использование закрывающего символа
/
в конце пути исключения. Если путь заканчивается на/
, это указывает на исключение каталога, а не просто файла. -
Использование фигурных скобок: Bash-расширение фигурных скобок должно быть корректным. Вы можете писать
{dir1,dir2}
для исключения нескольких директорий, но в контекстеrsync
всё же предпочтительно указать каждое исключение отдельно через--exclude
.
Корректная команда может выглядеть так:
rsync -aAX --exclude=another/ --exclude=temp/ $HOME/Documents/ $HOME/Backups/TEST
Применение (Application)
При выполнении резервного копирования в вашей системе стоит следовать следующим принципам и рекомендациям:
-
Понимание относительных путей: Всегда проверяйте, что пути, которые вы указываете в
--exclude
, правильные и указаны относительно исходного каталога. Если вы синхронизируете$HOME/Documents/
, исключения должны относиться к этой директории. -
Использование конфигурационных файлов: Вы можете упростить себе задачу использованием файлов
.rsync-filter
, которые содержат списки исключений, и управлять ими проще. Файл фильтра может быть в формате:# комментарии - /another/ - /temp/
И затем использовать опцию
-F
, которая автоматически применит эти правила:rsync -aAX -F $HOME/Documents/ $HOME/Backups/TEST/
-
Проверка синхронизации: Запустите
rsync
с опцией--dry-run
, чтобы симулировать процесс копирования. Это позволяет проверить, какие файлы будут скопированы, а какие исключены, без фактической передачи данных. -
Система создания резервных копий: Разработайте план регулярного создания резервных копий, чтобы важные данные были защищены. Используйте скрипты и планировщики задач, такие как
cron
, для автоматизации процесса.
Внедряя эти рекомендации, вы сможете значительно повысить эффективность и безопасность своих операций по управлению данными. Такой подход оценят в компании, где точность и надёжность обработки информационных массивов играют важнейшую роль в работе IT-инфраструктуры.