如何为名称包含空格的目录树编写 rsync 排除?

如何为名称包含空格的目录树编写 rsync 排除?

我正在尝试将目录树作为rsync嵌入bash脚本的命令的一部分排除,大致如下:

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

rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

我的目标是将 中的所有内容同步$SOURCEDIR/SomeTargetDir目标计算机上,但 下的所有内容除外Some Parent Directory/Another Directory。但是,我不断看到以下形式的错误:

rsync: link_stat "/Users/myusername/Parent\" failed: No such file or directory (2)

我猜想这与转义排除路径有关,但我似乎无法正确理解:我尝试的每种组合似乎都不正确。我该如何正确编写排除规则\\\

--exclude-from除非绝对必要,否则我不想使用。

我在 OS X 10.8 上使用 rsync 版本 3.0.9,通过 SSH 同步到 Ubuntu 12.04。

答案1

也排除匹配模式。请尝试如下操作:

$OPTIONS="-rl --exclude '*/Another Directory'"
rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

看到这个教程更多细节。

编辑#1

另一个建议是尝试转义双引号而不是使用单引号:

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

原帖作者尝试了这个替代方案,但对他来说还是不起作用。对于我使用“3.0.8 协议版本 30”的 Linux 来说,它确实有效rsync

答案2

使用--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 [email protected]:/SomeTargetDir

相关内容