我想从远程复制一个文件到本地系统。现在我在linux系统中使用scp命令。我有一些文件夹或文件名有空格,当我试图复制该文件时,它显示错误消息:“没有这样的文件或目录”。
我试着:
scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/
我在网上看到了一些参考资料,但我不太明白,有人能帮我吗?
我如何在复制过程中转义文件名或目录名中的空格…
我想从远程复制一个文件到本地系统。现在我在linux系统中使用scp命令。我有一些文件夹或文件名有空格,当我试图复制该文件时,它显示错误消息:“没有这样的文件或目录”。
我试着:
scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/
我在网上看到了一些参考资料,但我不太明白,有人能帮我吗?
我如何在复制过程中转义文件名或目录名中的空格…
当前回答
只需要在空格的位置插入通配符:'foo/bar*bar.txt'
其他回答
你也可以这样做:
scp foo@bar:"\"apath/with spaces in it/\""
第一级引号将由scp解释,然后第二级引号将保留空格。
在尝试从Bash脚本中使用scp从包含空格的远程路径复制文件时,我遇到了类似的问题。
以下是我想到的解决方案:
手动转义路径:
scp user@host:'dir\ with\ spaces/file\ with\ spaces' <destination>
scp user@host:"dir\\ with\\ spaces/file\\ with\\ spaces" <destination>
scp user@host:dir\\\ with\\\ spaces/file\\\ with\\\ spaces <destination>
注意:不需要选项-T(见下文)。
使用双引号+选项-T:
scp -T user@host:"'path with spaces'" <destination>
scp -T user@host:'"path with spaces"' <destination>
scp -T user@host:"\"path with spaces\"" <destination>
注意:如果没有选项-T,这些命令将失败,导致协议错误:文件名与请求不匹配。这里将详细讨论其原因。
使用Bash的printf转义路径:
source="path with spaces"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
用于shell的一行代码:
source="path with spaces"; printf -v source "%q" "${source}"; scp user@host:"${source}" <destination>
注意:没有选项-T也可以正常工作。
使用3个反斜杠来转义目录名中的空格:
scp user@host:/path/to/directory\\\ space /file ~/下载
应该从名为“带空格的目录”的远程目录中将文件复制到“下载”目录。
我有巨大的困难,使这一工作的shell变量包含一个文件名与空格。出于某种原因使用:
file="foo bar/baz"
scp user@example.com:"'$file'"
比如@Adrian的回答似乎失败了。
事实证明,最有效的方法是使用参数展开将反斜杠前置到空格,如下所示:
file="foo bar/baz"
file=${file// /\\ }
scp user@example.com:"$file"
我是Linux的新手,我使用Kali xD,这里是我的工作原理:如果你想用单个或多个空格传输文件,从你的系统到远程服务器:
$ scp this\ is\ my\ file tryhackme@1.1.1.1:/home/tryhackme
请注意,IP地址只是示例,最后一个I类型是目录,美元符号是提示符,代码以scp开头。
你也可以在文件传输时指定文件名,例如:/home/tryhackme/file1或单个或多个空格,如/home/tryhackme/"this\ is\ new\ file"。
从远程服务器到您的系统,与上面的单个或多个空间相同:
$ scp tryhackme@1.1.1.1:/home/tryhackme/"remote\ server\ file" "this is mine now"
请注意,您只对想要复制的文件使用反斜杠\\,因为您可以看到字符串“this is mine now”没有\\,因为这是我们想要传输到系统时的文件名,而不是我们想要安全复制的文件(scp)。抱歉我的解释,希望有人能理解,我希望这对需要另一种解决方案的人有帮助。