Bash - filename中的Rsync变量有空格

时间:2012-08-10 20:55:16

标签: bash variables directory rsync spaces

一直在寻找几个小时但仍然无法弄明白:(

无论如何,我创建一个脚本,它将自动rsync约40个不同的目录到另一台服务器上的40个其他目录。如果您想查看整个脚本,可以在此处查看:http://pastebin.com/Nt3KKvx9

但重要的是我运行rsync的for循环

for ((i=0; i<${#websys[@]}; i++))
do
  localpath="/nusdata/staff/NUS/NUS/Systems/${kiskasys[$i]}"
  remotepath="/home/www/html/nusalaska.com/html/systems/${websys[$i]}"
  rsync -rlptnvz -s "$localpath" -e "ssh -p 50014" "nusak@webserver:$remotepath/"
done 

问题是数组“kiskasys”有许多目录名,其中包含空格(例如:'101 greenbrook')。 我试过让数组变量在它们周围有单引号,在它们周围加双引号,转义空格如'\',以及所有三个的组合。我也尝试将$ localpath放在引号中,而不是引号等等。

我想我只是混淆了-s(--protect-args)如何处理空格以及如何让它在我的情况下工作。

错误输出总是如下所示:

rsync: change_dir "/nusdata/staff/NUS/NUS/101" failed: No such file or directory (2)

rsync: change_dir "/nusdata/staff/NUS/NUS/'101 greenbrook'" failed: No such file or directory (2)

感谢任何帮助!

由于

发现我的问题

在将我的代码从我的脚本复制到此页面时,我意外地将其复制错误...但是在复制错误时,上面发布的内容非常好,代码很好哈哈。

所以我上面发布的是我自己问题的解决方案。

原文在localpath变量中有单引号,如下所示:

localpath="'/nusdata/staff/NUS/NUS/Systems/${kiskasys[$i]}'"

单引号就是问题所在。为了每个人的利益,这里有一个示例输出

echo ${kiskasys[1]}

#output would look like this:

101 greenbrook

基本上没有特殊的转义字符等。

1 个答案:

答案 0 :(得分:4)

对于它的价值,我无法复制你的问题。如果我将localpathremotepath设置为包含空格的目录:

localpath="/home/lars/tmp/so/dir1/a directory"
remotepath="/home/lars/tmp/so/dir2/a directory"

然后运行您的rsync命令(稍微修改一下我的环境):

rsync -rlptvz -s "$localpath/" -e "ssh" "localhost:$remotepath/"

它正常工作。以下是dir1的内容:

dir1/a directory/file1
dir1/a directory/file3
dir1/a directory/file2

运行rsync后,dir2看起来像这样:

dir2/a directory/file1
dir2/a directory/file3
dir2/a directory/file2

您能否显示特定的命令行,导致您在上面看到的错误?也许使用-x标记运行脚本,并准确显示localpathremotepath的设置方式。