我是 linux 新手,我想将文件从远程复制到本地系统...现在我在 linux 系统中使用 scp 命令。当我尝试复制时,我有一些文件夹或文件名带有空格文件,它显示错误消息:“没有这样的文件或目录”
我试过了:
scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /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 选项(即 bash -vx
)启动一个 shell,它会在运行时显示该命令的插值版本。
"
或单 '
工作相同
使用 3 个反斜杠来转义目录名称中的空格:
scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads
应将名为 directory with spaces
的远程目录中的 file
复制到您的 Downloads
目录。
\\\_
被转义一次以获得 \_
,然后再次转义以获得空格 _
。我用 _
来清楚地表示一个空格。
您也可以执行以下操作:
scp foo@bar:"\"apath/with spaces in it/\""
第一级引号将由 scp 解释,然后第二级引号将保留空格。
我很难让它适用于包含带空格的文件名的 shell 变量。出于某种原因使用:
file="foo bar/baz"
scp user@example.com:"'$file'"
正如@Adrian 的回答似乎失败了。
事实证明,最好的方法是使用参数扩展在空格前添加反斜杠,如下所示:
file="foo bar/baz"
file=${file// /\\ }
scp user@example.com:"$file"
file="${file//\ /\\\ }"
${file//\ /\\\ }
优于 ${file// /\\ }
有什么原因吗?该空间是否出于某种原因需要逃逸?
在尝试使用 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
,这些命令会因 protocol error: filename does not match request
而失败。对此的原因进行了详细讨论here。
使用 printf 的转义路径:
source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
用于外壳的单衬层:
source="<path-with-spaces>"; printf -v source "%q" "${source}"; scp user@host:"${source}" <destination>
注意:没有选项 -T
可以正常工作。
printf
替代方案添加了一个单行。
scp ael5105@192.168.0.200:/home/5105/test/gg/Untitled?Folder/a/qy.jpg /var/www/try/
这 ?在遥控器上执行 glob 并将匹配任何字符,包括空格
很抱歉使用此 Linux 问题在 Windows 10 上为 Powershell 提供此提示:在这种情况下,用反斜杠转义或用引号括起来的空格字符对我不起作用。效率不高,但我使用“?”解决了它char 代替:
对于文件“tasks.txt Jun-22.bkp”,我使用“tasks.txt?Jun-22.bkp”下载了它
我是 Linux 新手,我使用的是 Kali xD,我的工作原理是:如果您想使用单个或多个空格传输文件,请从您的系统到远程服务器:
$ scp this\ is\ my\ file tryhackme@1.1.1.1:/home/tryhackme
注意IP地址只是示例,最后输入的是目录和美元符号是提示符,代码以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)。抱歉我的解释,我希望有人能理解,我希望这对需要其他解决方案的人有所帮助。
如果文件或文件夹名称之间有空格,那么您只需在空格前添加一个黑色斜杠 '',然后将整个路径放在单引号 ('') 内,它就可以工作了。
例子:
假设文件夹名称是“测试文件夹”,它位于远程机器的 /home/ 内。然后您可以使用以下 scp 命令访问或下载该文件夹。
scp -r <user>@<host>:'/home/Test\ Folder' .
在 linux-terminal 或 cmd 中,如果单词之间的路径中有空格,则必须使用引号 ('') ("") 标记。
你应该是这样的:
$ '/home/tryhackme'
不是
$ /home/tryhackme
scp user@example.com:'$(ls -t | head -1)' .
来获取服务器中最近创建的文件,或者scp user@example.com:'dir/*.{xml,pdf}' .
来从远程目录获取所有 xml 和 pdf 文件。一般来说,我更喜欢这个而不是方便使用有空格的文件。带空格的文件总是很麻烦。