如何使用scp命令传输带有空格名称的目录
如何使用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语句是可以工作的。
问题出现的原因是在使用scp命令传输带有空格的目录时出现了错误,导致无法完成传输。解决方法是通过设置字段分隔符为一个空格,并使用适当的转义字符来避免空格造成的问题。
具体的解决方法如下:
1. 首先,保存原始的字段分隔符,可以使用IFS=$OIFS
命令来保存。
2. 将字段分隔符设置为一个空格,可以使用IFS=$"\ "
命令来设置。
3. 定义当前目录的变量,例如:current_dir="some dir with spaces"
。
4. 定义用于scp命令传输的当前目录的变量,并使用适当的转义字符,例如:scp_current_dir="some\\ dir\\ with\\ spaces"
。
5. 定义目录名称的变量,例如:dir_name="another dir with spaces"
。
6. 定义用于scp命令传输的目录名称的变量,并使用适当的转义字符,例如:scp_dir_name="another\\ dir\\ with\\ spaces"
。
7. 使用ssh命令检查目录是否存在,如果存在,则执行scp命令传输目录;如果不存在,则创建新目录并执行scp命令传输目录。
8. 最后,将字段分隔符设置回原始的值,可以使用IFS=$OIFS
命令来恢复。
通过以上的解决方法,可以解决在scp命令传输带有空格的目录时出现的问题。
问题出现的原因是由于目录名称中包含空格,导致使用scp命令复制目录时出现错误。解决方法是使用sed命令对目录名称中的空格进行转义,将空格替换为"\ ",以确保目录名称被正确识别为一个字符串。通过对目录名称进行转义,可以避免空格被解析为命令的分隔符,确保目录名称作为一个整体被读取。
具体的解决方法如下:
1. 使用sed命令对目录名中的空格进行转义,将空格替换为"\ ",并将转义后的目录名保存到一个变量中。
2. 将转义后的目录名作为参数传递给scp命令,以确保目录名被正确识别为一个字符串。
以下是具体的代码示例:
current_dir="/usr/bin/Directory With Spaces" escaped_current_dir=$(sed 's/ /\\ /g' <<< "$current_dir") # escaped_current_dir="/usr/bin/Directory\ With\ Spaces"
通过上述的代码示例,我们可以看到使用sed命令对目录名进行转义后,转义的目录名将作为一个整体字符串被读取,从而解决了目录名中包含空格所导致的问题。
问题原因:文件名中含有空格,导致scp命令无法正常执行。
解决方法:使用两组引号将文件名括起来,因为文件名需要在本地计算机和远程计算机上分别解释。
具体代码如下:
scp -i key -r "$current_dir/$dir_name" user@$ip:"'$current_dir/$dir_name'"
这样的方法可以成功解决问题,并且非常感谢miken提供的帮助。这也提醒了我要学会如何使用stalkoverflow。在此之前,通过谷歌搜索并没有得到这个答案。总之,感谢miken的帮助!祝大家感恩节快乐。
关于如何确定远程计算机使用的是哪个shell以确定使用哪种引号语法进行内部引用的问题,确实是个很好的问题。是的,您确实需要知道远程计算机上运行的是哪个shell(除非是像Windows这样的令人发指的东西,我认为您可以假设使用sh
引号语法)。
我不知道有没有任何一种shell在单引号中包装标识符时不会将空格隔离开来,但是如果存在这样的情况,是的,您需要进行调整。