Я пытаюсь исключить дерево каталогов как часть rsync
команда, встроенная в bash
сценарий примерно так:
$OPTIONS="-rl --exclude 'Some Parent Directory/Another Directory'"
rsync $OPTIONS $SOURCEDIR a@b.com:/SomeTargetDir
Моя цель - синхронизировать все $SOURCEDIR
в /SomeTargetDir
на целевой машине, за исключением всего, что находится под Some Parent Directory/Another Directory
. Однако я продолжаю видеть ошибки такой формы:
rsync: link_stat "/Users/myusername/Parent\" failed: No such file or directory (2)
Я предполагаю, что это связано с выходом из пути исключения, но я просто не могу понять это правильно: каждая комбинация \\
, \
и так далее, что я пытаюсь, кажется неправильным. Как правильно написать правило исключения?
Я не хочу использовать --exclude-from
если только в этом нет крайней необходимости.
Я использую rsync версии 3.0.9 в OS X 10.8, синхронизируясь с Ubuntu 12.04 через SSH.
Использовать --exclude-from
. В файле исключения все шаблоны будут помещены в новую строку, и вы можете забыть о кавычках, экранировании и проблемах с пробелами.
У меня есть сценарий, похожий на ваш, и я это сделал. Обратите внимание, что с помощью этого решения я создаю файл исключения в своем сценарии, поэтому мне все равно нужно убедиться, что кавычки верны. Если у вас может быть статический файл исключения, это будет еще проще.
# create a temporary file
RSYNC_EXCLUDES=$( mktemp -t rsync-excludes )
# remove the temp file when the script exits
trap "rm -f $RSYNC_EXCLUDES" EXIT
# populate the exclusion file
echo 'Some Parent Directory/Another Directory' > "$RSYNC_EXCLUDES"
# have your options point to your exclusion file
$OPTIONS="-rl --exclude-from='$RSYNC_EXCLUDES'"
# profit
rsync $OPTIONS $SOURCEDIR a@b.com:/SomeTargetDir
Также исключайте шаблоны совпадений. Так что попробуйте это так:
$OPTIONS="-rl --exclude '*/Another Directory'"
rsync $OPTIONS $SOURCEDIR a@b.com:/SomeTargetDir
Посмотри это руководство Больше подробностей.
Еще одно предложение - попытаться избежать двойных кавычек, а не использовать одинарные:
$OPTIONS="-rl --exclude \"Some Parent\ Directory/Another\ Directory\""
ОП попробовал эту альтернативу, но в его случае она все равно не сработала. У меня это работает в Linux с использованием версии «3.0.8 протокола версии 30» из rsync
.