我正在尝试将目录树作为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