我想从远程复制一个文件到本地系统。现在我在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/
我在网上看到了一些参考资料,但我不太明白,有人能帮我吗?
我如何在复制过程中转义文件名或目录名中的空格…
当前回答
scp ael5105@ 192168 /home/5105/test/gg/Untitled?文件夹/a/qy /var/www/try/
的吗?远程和将匹配任何字符,包括空格吗
其他回答
scp ael5105@ 192168 /home/5105/test/gg/Untitled?文件夹/a/qy /var/www/try/
的吗?远程和将匹配任何字符,包括空格吗
基本上你需要转义它两次,因为它在本地转义然后在远端转义。
有几个选项你可以做(在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 .
作品
scp localhost:"f/a\ b\ c" .
scp localhost:'f/a\ b\ c' .
不起作用
scp localhost:'f/a b c' .
原因是在将路径传递给scp命令之前,shell会对字符串进行解释。因此,当它到达远程时,远程正在寻找一个带未转义引号的字符串,它失败了
要查看这一操作,使用-vx选项启动shell,即bash -vx,它将在运行时显示该命令的插值版本。
你也可以这样做:
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也可以正常工作。