如何在Linux中的SCP复制路径中转义空格?


307

我是Linux新手,我想将文件从远程复制到本地系统...现在,我在Linux系统中使用scp命令。文件,它显示错误消息:“没有这样的文件或目录”

我试过了:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

我在网上看到了一些参考资料,但我不太了解,有人可以帮忙吗?

复制期间如何在文件名或目录名中转义空格...


不行!!已经做到了
。.– AlexPandiyan

仔细检查文件是否确实存在。将引号括在整个路径中,包括登录名和IP地址。或者,可以将引号放在远端,并在空格前加反斜杠。

Answers:


491

基本上,您需要对其进行两次转义,因为它是在本地然后在远端进行了转义。

您可以选择几种方式(bash中):

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

11
这是非常小的,但是在Mac和大多数控制台应用程序(如Terminal)中,有“粘贴转义文本”选项。因此,我使用了第二个选项。
2014年

3
“” path“'工作正常,而”“ path”“失败;结论先用单引号引起来,然后用双引号引起来

7
哇!这可能是我见过的最荒谬的程序行为!
jankes

2
@jankes这不是没有优点。您放置的内容带有shell命令参数,这一事实使您可以执行以下操作,例如scp user@example.com:'$(ls -t | head -1)' .获取服务器中最新创建的文件,或scp user@example.com:'dir/*.{xml,pdf}' .从远程目录获取所有xml和pdf文件。通常,与具有空格的文件相比,我更喜欢这样做。带空格的文件总是很麻烦。
JoL

1
为什么要逃避2次?有什么办法可以改变这种行为?
Fractale

76

作品

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

不起作用

scp localhost:'f/a b c' .

原因是在路径传递到scp命令之前,shell会解释字符串。因此,当到达远程服务器时,远程服务器正在寻找带有未转义引号的字符串,但失败

要查看实际情况,请使用-vx选项启动外壳程序,即bash -vx,它将在运行命令时显示命令的内插版本。


使用单引号和转义符对我
有用,

1
@MauricioTrajano看看gnu.org/software/bash/manual/html_node/Quoting.html所有引号都有不同的作用。在上述双重"或单项'工作的简单情况下,相同
Vorsprung '18

34

您也可以执行以下操作:

scp foo@bar:"\"apath/with spaces in it/\""

第一级报价将由scp解释,然后第二级报价将保留空格。


4
考虑到它可以使用相同数量的转义字符来处理多少个空格,因此该答案被低估了。谢谢!
迈克尔

20

使用3个反斜杠转义目录名称中的空格:

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

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


这是唯一在Ubuntu 19.10上为我工作的软件。没有双引号,没有软硬引用,没有引号。只有三倍的空格。很奇怪。谢谢!
uldics

9

我很难将其用于包含空格的文件名的shell变量。由于某些原因使用

file="foo bar/baz"
scp user@example.com:"'$file'"

就像@Adrian的回答似乎失败了。

事实证明,最有效的方法是使用参数扩展将反斜杠添加到空白之前,如下所示。

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

我建议进行更强有力的“全部替代”扩展: file="${file//\ /\\\ }"
troyfolger

忘记了这种区别-我对参数扩展感到生疏。谢谢!
卢克·戴维斯

我没有变量,但是对于有很多空间的路径,这可以使我很好地替代3个反斜杠。没有人有时间!
罗伯特·邓登'18

1

很抱歉使用这个Linux问题在Windows 10上为Powershell提供这个技巧:在这种情况下,空格反斜杠或引号引起来的空格对我不起作用。效率不高,但是我用“?”解决了 字符代替:

对于文件“ tasks.txt Jun-22.bkp”,我使用“ tasks.txt?Jun-22.bkp”下载了它

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.