我是Linux新手,我想把一个文件从远程复制到本地系统…现在我在Linux系统中使用scp命令。我有一些文件夹或文件名带有空格,当我试图复制该文件时,它会显示错误消息:"没有这样的文件或目录"
我试过:
scpael5105@192.168.0.200:'/home/5105/test/gg/UntitledFolder/a/qy.jpg'/var/www/try/
我在网上看到了一些参考资料,但我不完全理解,有人能帮我吗?
如何在复制过程中转义文件名或目录名中的空格…
不工作!!已经开始了……
再次检查文件是否确实存在。在整个路径周围加上引号,包括登录名和IP地址。或者,远程引用并用反斜杠代替空格。
基本上,你需要逃出两次,因为它是在本地逃出的,然后在远端逃出的。
您可以(在bash中)执行以下几个选项:
scpuser@example.com:"'web/tmp/MasterFile181013.xls'".
scpuser@example.com:"web/tmp/Master\File\18\10\13.xls".
scpuser@example.com:web/tmp/Master\\\File\\\18\\\10\\\13.xls.
这是一个很小的问题,但是在Mac和终端等大多数控制台应用程序中,都有一个"粘贴转义文本"选项。因此我使用了第二个选项。
这里有一个相关的问题:stackoverflow.com/questions/5608112/…
谢谢,这似乎有违直觉…
当"path"失败时,"path"工作;先结束单引号,然后结束双引号
真的!这可能是我见过的最荒谬的节目行为!
@简克斯,这不是没有优点的。事实上,您所放置的shell命令参数允许您执行诸如scp user@example.com:'$(ls -t | head -1)' .之类的操作以获取服务器中最近创建的文件,或者scp user@example.com:'dir/*.{xml,pdf}' .从远程目录获取所有XML和PDF文件。一般来说,我更喜欢这种方式,而不是使用有空间的文件。带有空格的文件总是很麻烦。
为什么要逃跑两次?有什么方法可以改变这种行为吗?
作品
scplocalhost:"f/a\b\c".
scplocalhost:'f/a\b\c'.
不工作
scplocalhost:'f/abc'.
原因是,在将路径传递给scp命令之前,shell会对字符串进行解释。因此,当它到达远程时,远程程序正在寻找一个带有未转义引号的字符串,但失败了。
若要查看此操作,请使用-vx选项(即EDOCX1[0])启动shell,它将在运行命令时显示该命令的内插版本。
使用单引号和转义对我有效,但不是双引号
@Mauriciotrajano看看gnu.org/software/bash/manual/html_node/quoting.html所有的引号都有不同的功能。在上述简单情况下,双"或单'的工作原理相同。
此外,您还可以执行以下操作:
scpfoo@bar:""apath/withspacesinit/""
第一级引号将由SCP解释,第二级引号将保留空格。
考虑到使用相同数量的转义字符可以处理多少空格,该答案的评级过低。谢谢!
使用3个反斜杠来转义目录名称中的空格:
scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads
应该从名为directory with spaces的远程目录复制file到您的Downloads目录。
我很难让它适用于包含带有空格的文件名的shell变量。结果发现使用
file="foobar/baz"
scpuser@example.com:"'$file'"
正如@adrian的答案似乎是失败的(尝试在上述命令之前输入set -x,看看shell是如何解释这个字符串的;这是非常不可靠的,我不太明白它为什么会失败)。
结果发现,最有效的方法是使用参数扩展来在空白前加上反斜杠,如下所示。
file="foobar/baz"#afileinsideadirectory-namewithwhitespace
file="${file//\/\\\}"#the`//`replacesallinstances;`/`justreplacesthefirst
scpuser@example.com:"$file"
我建议更稳健的"全部替代"扩张:file="${file//\ /\\\ }"
忘记了这一区别——我对参数扩展感到生疏。谢谢!
我没有一个变量,但这让我很满意,对于一条有很多空间的路径,它可以作为3个反斜杠的好选择。没有人有时间去做!