带有空格和 bash 的目录名称

带有空格和 bash 的目录名称

我想从备份中排除目录“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

相关内容