如何 scp 名称中带有 space 的目录
How to scp a directory with a space in the name
我正在尝试将整个目录从一个集群镜像复制到另一个集群。但是当名称中有 space 时它会失败,我不知道如何解决这个问题,因为 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
我试过单引号、双引号和带双引号的单引号,但其中 none 有效。谁能帮我解决?顺便说一句,代码中的 mkdir 语句有效。
您可以使用 sed
转义目录名称中的空格:
current_dir = "/usr/bin/Directory With Spaces"
escaped_current_dir = `sed s/ /\ /g $current_dir`
# escaped_current_dir = "/usr/bin/Directory\ With\ Spaces"
带有转义空格的字符串将被读取为一个字符串,并且只读取一个字符串,这就是我们想要的。
您需要将字段分隔符设置为 space。
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
与detailed in this answer一样,您需要使用两组引号,因为文件名被解释两次:一次由本地计算机解释,一次由远程计算机解释。
scp -i key -r "$current_dir/$dir_name" user@$ip:"'$current_dir/$dir_name'"
我正在尝试将整个目录从一个集群镜像复制到另一个集群。但是当名称中有 space 时它会失败,我不知道如何解决这个问题,因为 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
我试过单引号、双引号和带双引号的单引号,但其中 none 有效。谁能帮我解决?顺便说一句,代码中的 mkdir 语句有效。
您可以使用 sed
转义目录名称中的空格:
current_dir = "/usr/bin/Directory With Spaces"
escaped_current_dir = `sed s/ /\ /g $current_dir`
# escaped_current_dir = "/usr/bin/Directory\ With\ Spaces"
带有转义空格的字符串将被读取为一个字符串,并且只读取一个字符串,这就是我们想要的。
您需要将字段分隔符设置为 space。
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
与detailed in this answer一样,您需要使用两组引号,因为文件名被解释两次:一次由本地计算机解释,一次由远程计算机解释。
scp -i key -r "$current_dir/$dir_name" user@$ip:"'$current_dir/$dir_name'"