Назад | Перейти на главную страницу

Как написать исключение rsync для дерева каталогов с именами, содержащими пробелы?

Я пытаюсь исключить дерево каталогов как часть 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

Посмотри это руководство Больше подробностей.

ИЗМЕНИТЬ # 1

Еще одно предложение - попытаться избежать двойных кавычек, а не использовать одинарные:

$OPTIONS="-rl --exclude \"Some Parent\ Directory/Another\ Directory\""

ОП попробовал эту альтернативу, но в его случае она все равно не сработала. У меня это работает в Linux с использованием версии «3.0.8 протокола версии 30» из rsync.