我正在尝试使用安全复制(scp)复制文件。我正在尝试执行以下命令,但由于目录位置的绝对路径中存在空格而出现错误。
scp -r -P 8484 [email protected]:/media/New Volume/lj /home/pratheep
我收到以下错误:
scp: /media/New: No such file or directory
scp: Volume/lj: No such file or directory
我尝试使用相同的命令添加额外的反斜杠,例如
scp -r -P 8484 [email protected]:/media/New\ Volume/lj /home/pratheep
但我仍然遇到同样的错误。
有人可以告诉我如何纠正它吗?
答案1
您应该引用文件名两次,一次用于本地 shell,一次用于远程 shell。在最简单的情况下,您可以执行以下操作之一
scp -r -P 8484 [email protected]:"'/media/New Volume/lj'" /home/pratheep
scp -r -P 8484 [email protected]:'"/media/New Volume/lj"' /home/pratheep
或使用制表符补全的帮助
scp -r -P 8484 [email protected]:/media/New\\\ Volume/lj /home/pratheep
答案2
scp
并将rsync
远程文件名传递给远程 shell。这允许您传递模式,如
scp remotehost:'*.txt' .
但它有一个令人讨厌的后果,即在提供远程文件名时需要额外的引用。
您可以传递该-s
选项以rsync
使其保护文件名不被远程 shell 扩展。但这会打开 rsync 的内置通配符扩展,因此您仍然需要引用\[?*
.
解决方法是传输存档:
ssh -P 8484 [email protected] 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep
另一种方法是挂载远程文件系统,然后使用普通工具执行复制。
mkdir mnt
sshfs -p 8484 [email protected]:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt
答案3
当尝试使用scp
Bash 脚本从包含空格的远程路径复制文件时,我遇到了类似的问题。
以下是我提出的解决方案:
手动退出路径:
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
.详细讨论了原因这里。
使用 printf 的转义路径:
source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
注意:这在没有选项的情况下工作正常-T
,但仅适用于单个文件。对于多个文件,-T
再次需要选项(与上面相同的错误)。