关于unix:如何在Linux中的scp复制期间转义路径中的空格?

How to escape spaces in path during scp copy in Linux?

我是Linux新手,我想把一个文件从远程复制到本地系统…现在我在Linux系统中使用scp命令。我有一些文件夹或文件名带有空格,当我试图复制该文件时,它会显示错误消息:"没有这样的文件或目录"

我试过:

1
scp [email protected]:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

我在网上看到了一些参考资料,但我不完全理解,有人能帮我吗?

如何在复制过程中转义文件名或目录名中的空格…


基本上,你需要逃出两次,因为它是在本地逃出的,然后在远端逃出的。

您可以(在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个反斜杠来转义目录名称中的空格:

scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

应该从名为directory with spaces的远程目录复制file到您的Downloads目录。


我很难让它适用于包含带有空格的文件名的shell变量。结果发现使用

1
2
file="foo bar/baz"
scp [email protected]:"'$file'"

正如@adrian的答案似乎是失败的(尝试在上述命令之前输入set -x,看看shell是如何解释这个字符串的;这是非常不可靠的,我不太明白它为什么会失败)。

结果发现,最有效的方法是使用参数扩展来在空白前加上反斜杠,如下所示。

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"