How to escape spaces in path during scp copy in Linux?
我是Linux新手,我想把一个文件从远程复制到本地系统…现在我在Linux系统中使用scp命令。我有一些文件夹或文件名带有空格,当我试图复制该文件时,它会显示错误消息:"没有这样的文件或目录"
我试过:
1 |
我在网上看到了一些参考资料,但我不完全理解,有人能帮我吗?
如何在复制过程中转义文件名或目录名中的空格…
基本上,你需要逃出两次,因为它是在本地逃出的,然后在远端逃出的。
您可以(在bash中)执行以下几个选项:
1 2 3 | scp [email protected]:"'web/tmp/Master File 18 10 13.xls'" . scp [email protected]:"web/tmp/Master\ File\ 18\ 10\ 13.xls" . scp [email protected]:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls . |
作品
1 2 3 | scp localhost:"f/a\ b\ c" . scp localhost:'f/a\ b\ c' . |
不工作
1 | scp localhost:'f/a b c' . |
原因是,在将路径传递给scp命令之前,shell会对字符串进行解释。因此,当它到达远程时,远程程序正在寻找一个带有未转义引号的字符串,但失败了。
若要查看此操作,请使用-vx选项(即EDOCX1[0])启动shell,它将在运行命令时显示该命令的内插版本。
此外,您还可以执行以下操作:
1 | scp foo@bar:""apath/with spaces in it/"" |
第一级引号将由SCP解释,第二级引号将保留空格。
使用3个反斜杠来转义目录名称中的空格:
应该从名为
我很难让它适用于包含带有空格的文件名的shell变量。结果发现使用
1 2 |
正如@adrian的答案似乎是失败的(尝试在上述命令之前输入
结果发现,最有效的方法是使用参数扩展来在空白前加上反斜杠,如下所示。
1 2 3 | file="foo bar/baz" # a file inside a directory-name with whitespace file="${file//\ /\\\ }" # the `//` replaces all instances; `/` just replaces the first scp [email protected]:"$file" |