Я только начал пытаться использовать rsync для резервного копирования с пары машин Linux на сервер Windows, на котором работает остальная часть системы резервного копирования. После долгого чтения и экспериментов я, наконец, все это заработало на одной из машин Linux (Centos), поэтому я скопировал сценарий на другую машину (Debian), отредактировал некоторые пути и попытался запустить его. Вместо того, чтобы работать, как на первой машине, я получаю следующий результат:
building file list ...
1 file to consider
sent 36 bytes received 16 bytes 11.56 bytes/sec
total size is 0 speedup is 0.00
Рассматриваемый сценарий:
#! /bin/sh
/usr/bin/rsync \
--progress \
--recursive \
-t \
--delete-excluded \
--filter="- .cpan/***" \
--filter="- include/***" \
--filter="- cache/***" \
--filter="- lib/***" \
--filter="- cvs/***" \
--filter="+ /BayesTraining/***" \
--filter="+ /BogoTraining/***" \
--filter="+ /etc/***" \
--filter="+ /var/***" \
--filter="+ /root/***" \
--filter="+ /boot/***" \
--filter="+ /usr/local/***" \
--filter="+ /home/***" \
--filter="- *" \
/ \
rsync://myserver/targetfolder
Он начнет отправлять файлы только в том случае, если я удалю этот последний параметр фильтра, но затем он отправит целую кучу больше, чем я хочу.
Где я набился и что мне нужно изменить? (Прежде чем кто-нибудь спросит, я не использую rsync через SSH, потому что на сервере Windows еще нет службы SSH. Небольшие шаги ...)
Редактировать: rsync --version показывает
Centos: rsync version 2.6.8 protocol version 29
Debian: rsync version 2.6.4 protocol version 29
Решение: Спасибо pavium за указание на то, что я упустил из виду важную часть справочной страницы (переформатированной для удобства чтения):
a trailing "dir_name/***" will match both the directory (as if "dir_name/"
had been specified) and everything in the directory (as if "dir_name/**"
had been specified). This behavior was added in version 2.6.7.
Решение состоит в том, чтобы создать следующие правила для каждого каталога, который я хочу включить:
--filter="+ /dirname/"
--filter="+ /direname/**"
Последний пункт фильтра может быть вашей проблемой (ну, я думаю, вы знать который). Я нашел следующее в rsync
2.6.9 страница руководства:
Обратите внимание, что при использовании параметра --recursive (-r) (что подразумевается параметром -a) каждый подкомпонент каждого пути посещается сверху вниз, поэтому шаблоны включения / исключения рекурсивно применяются к полному имени каждого подкомпонента (например, для включения «/ foo / bar / baz» субкомпоненты «/ foo» и «/ foo / bar» не должны быть исключены). Шаблоны исключения фактически сокращают этап обхода каталога, когда rsync находит файлы для отправки. Если шаблон исключает конкретный родительский каталог, он может сделать более глубокий шаблон включения неэффективным, потому что rsync не прошел через этот исключенный раздел иерархии. Это особенно важно при использовании правила завершающего ’*’. Например, это не сработает:
+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *
Это не удается, поскольку родительский каталог some исключен правилом ’*’, поэтому rsync никогда не посещает файлы в каталогах some или some / path. Одним из решений является запрос на включение всех каталогов в иерархии с помощью одного правила: «+ * /» (поместите его где-нибудь перед правилом «- *») и, возможно, используйте параметр --prune-empty-dirs . Другое решение - добавить специальные правила включения для всех родительских каталогов, которые необходимо посетить. Например, этот набор правил работает нормально:
+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *
Итак, - * исключает пути не явно включен ранее в правила фильтрации. На странице руководства также говорится, что конечное поведение "dir_name / ***" (которое бы включили эти пути) был добавлен в версии 2.6.7 (ваш Debian более ранний)
Активирован режим психической отладки:
Bash, вероятно, расширяет *
в список всех файлов в текущем каталоге, поэтому rsync не видит *
он видит file1 file2 file3
.
Попробуйте сбежать из *
- --filter="- \*" \
, или --filter='- *' \
должен сделать свое дело.
Запустите rsync --version в своих ящиках CentOS и Debian и сравните результаты. Возможно, Debian старше? Возможно, это ошибка конкретной версии или способа, которым она была скомпилирована на этом компьютере.