我想从备份中排除目录“temp”和“Ubuntu One/”。空格的正确转义是什么???
RSYNCCONF="--delete --exclude=.* --exclude=temp/"
提前致谢!
- 克里斯
编辑/PS:
excludes=( ".*" temp/ "Ubuntu One/" )' 'RSYNCCONF="${excludes[@]/#/--exclude=}"
和
$RSYNC -e "$S" -avR $FROMSSH:$SOURCE ${RSYNCCONF[@]} $TARGET$TODAY $INC >> $LOG 2>&1
没用。我非常感激任何建议。
这是脚本:http://wiki.ubuntuusers.de/_attachment?target=Skripte%2FBackup_mit_RSYNC%2Fbackup.sh
答案1
如果你在字符串中构建选项,那么当你尝试使用它时会遇到问题(rsync "$RSYNCCONF"
)。最好使用数组——当你取消引用数组时,每个元素都会被 shell 正确处理:
RSYNCCONF=( --delete '--exclude=.*' --exclude=temp/ '--exclude="Ubuntu One/"' )
rsync "${RSYNCCONF[@]}"
答案2
将其放入单引号中:
RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude='Ubuntu One/' "
或者在空格前加上反斜杠:
RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude=Ubuntu\\ One/ "
答案3
这是实现此目的的一种方法。
excludes=( ".*" temp/ "Ubuntu One/" )
rsync --delete "${excludes[@]/#/--exclude=}"
请注意,以上内容使用的是 bash 语法,因此它不适用于 sh。另外,引号至关重要,请不要省略它们。
看http://mywiki.wooledge.org/WordSplitting解释为什么将多个参数放入字符串变量是错误的。
编辑:从您评论中的 pastebin 来看,这似乎就是您想要的。
#!/bin/bash
source=/home/chris/
backupdir=/media/alteplatte/backups
backupname=$(date +%Y-%m-%d)-cd
excludes=( ".*" temp/ "Ubuntu One/" )
linkdest=$backupdir/link
if [[ -d $backupdir ]]; then
rsync -av ${linkdest:+"--link-dest=$linkdest"} --delete \
"${excludes[@]/#/--exclude=}" "$source" "$backupdir/$backupname"
else
echo "$0: $backupdir: Not a directory, make sure the filesystem is mounted" >&2
exit 1
fi