如何使用名称

时间:2015-11-24 20:27:47

标签: bash scp

我正试图将整个目录从一个群集镜像到另一个群集。但是当名称中有空格时它会失败,我无法弄清楚如何解决这个问题,因为scp似乎认为我正在复制多个文件。我使用变量来标记我需要的路径,所以看起来似乎不会通过添加反斜杠来轻松解决。

这是我正在使用的代码:

if ssh user@ip -i key test -d "'$current_dir'"; then
 echo "Directory exists. Ready to copy $dir_name."
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$current_dir/$dir_name"
else
 echo Directory doesn\'t exist. Making a new directory.
 ssh user@$ip -i key mkdir "'$current_dir'"
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$current_dir/$dir_name"
fi

我试过单引号,双引号和带双引号的单引号,但它们都不起作用。任何人都可以帮我解决吗?顺便说一句,代码中的mkdir语句可以工作。

3 个答案:

答案 0 :(得分:2)

作为搜索“scp空格”的第一个命中的detailed in this answer,你需要使用两组引号,因为文件名被解释两次:一次是本地计算机,一次是远程计算机。

scp -i key -r "$current_dir/$dir_name" user@$ip:"'$current_dir/$dir_name'"

答案 1 :(得分:-1)

您可以使用sed转义目录名称中的空格:

current_dir = "/usr/bin/Directory With Spaces"
escaped_current_dir = `sed s/ /\\ /g $current_dir`
# escaped_current_dir = "/usr/bin/Directory\ With\ Spaces"

带有转义空格的字符串将被读取为一个字符串,并且只读取一个字符串,这就是我们想要的。

答案 2 :(得分:-1)

您需要将字段分隔符设置为空格。

OIFS=$IFS  #save the original
IFS=$"\ "  #set to space
current_dir="some dir with spaces"
scp_current_dir="some\\ dir\\ with\\ spaces"
dir_name="another dir with spaces"
scp_dir_name="another\\ dir\\ with\\ spaces"
if ssh user@ip -i key test -d $current_dir; then
 echo "Directory exists. Ready to copy $dir_name."
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$scp_current_dir/$scp_dir_name"
else
 echo Directory doesn\'t exist. Making a new directory.
 ssh user@$ip -i key mkdir $current_dir
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$scp_current_dir/$scp_dir_name"
fi
IFS=$OIFS  #reset it back to the original