我正试图将整个目录从一个群集镜像到另一个群集。但是当名称中有空格时它会失败,我无法弄清楚如何解决这个问题,因为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语句可以工作。
答案 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