如何在Linux中的scp复制期间转义路径中的空格?

Ale*_*yan 278 unix linux ubuntu whitespace scp

我是linux的新手,我想将文件从远程复制到本地系统...现在我在linux系统中使用scp命令..我有一些文件夹或文件名是带空格的,当我尝试复制时文件,它显示错误消息:"没有这样的文件或目录"

我试过了:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/
Run Code Online (Sandbox Code Playgroud)

我在网上看到了一些参考资料,但我不完全理解,有人可以帮忙吗?

如何在复制过程中转义文件名或目录名中的空格...

Adr*_*wan 448

基本上你需要两次逃避它,因为它在本地转义然后在远程端转义.

你可以做几个选项(在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 .
Run Code Online (Sandbox Code Playgroud)

  • 这是非常小的,但在Mac和大多数控制台应用程序(如终端)中,都有一个"粘贴转义文本"选项.因此,我使用了第二种选择. (9认同)
  • @jankes 这不是没有优点。事实上,你在那里放的是一个 shell 命令参数,这允许你做类似 `scp user@example.com:'$(ls -t | head -1)' .` 之类的事情来获取服务器中最近创建的文件, 或 `scp user@example.com:'dir/*.{xml,pdf}' .` 从远程目录获取所有 xml 和 pdf 文件。一般来说,我更喜欢这样,而不是使用有空格的文件方便。带有空格的文件总是很麻烦。 (7认同)
  • 哇!这可能是我见过的最荒谬的程序行为! (3认同)
  • “” path“'有效,而”“ path”“失败;结论先将单引号引起来,然后将双引号引起来 (2认同)
  • 为什么它是逃避2次?有什么办法可以改变这种行为? (2认同)
  • 如何知道另一端将使用什么 shell 以便知道内部引用应用哪种引用语法?此方法是否只能在脚本作者控制另一端 shell 的脚本中使用? (2认同)
  • scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" 。作品 (2认同)
  • 由于协议错误,我还必须向 scp 添加 -T 标志:/sf/ask/3821908261/ (2认同)

Vor*_*ung 69

作品

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .
Run Code Online (Sandbox Code Playgroud)

不起作用

scp localhost:'f/a b c' .
Run Code Online (Sandbox Code Playgroud)

原因是在将路径传递给scp命令之前,shell会解释该字符串.因此当它到达远程时,远程正在查找带有未转义引号的字符串,但它失败了

要查看此操作,请使用-vx选项启动一个shell,bash -vx它将在运行命令时显示该命令的插值版本.


Mat*_*ttK 31

你也可以这样做:

scp foo@bar:"\"apath/with spaces in it/\""
Run Code Online (Sandbox Code Playgroud)

第一级引号将由scp解释,然后第二级引号将保留空格.

  • 考虑到它可以使用相同数量的转义字符来处理多少个空格,因此该答案被低估了。谢谢! (3认同)

Max*_*xim 30

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>
Run Code Online (Sandbox Code Playgroud)

注意:不需要选项-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>
Run Code Online (Sandbox Code Playgroud)

注意:如果没有选项-T,这些命令将失败并显示protocol error: filename does not match request这里详细讨论其原因。

使用 Bash 的 printf 的转义路径:

source="path with spaces"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
Run Code Online (Sandbox Code Playgroud)

用于外壳使用的单衬管:

source="path with spaces"; printf -v source "%q" "${source}"; scp user@host:"${source}" <destination>
Run Code Online (Sandbox Code Playgroud)

注意:无需选项即可正常工作-T

  • 感谢您提供 printf 解决方案。这是唯一对我有用的。我需要它作为源和目的地。仅供参考,可以将所有内容与“;”放在同一行 (3认同)

Chr*_*ris 9

使用3个反斜杠转义目录名称中的空格:

scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

应该从名为的远程目录复制到您的Downloads目录。filedirectory with spaces

  • 这是唯一在 Ubuntu 19.10 上对我有用的。没有双引号,没有软引号和硬引号,没有转义引号。只有三重反斜杠空格。很奇怪。谢谢你! (2认同)
  • 请参阅@AdrianGunawan 的[答案](/sf/answers/1425491931/)。它在本地主机上转义一次,然后在远程主机上转义第二次。因此`\\\_`被转义一次得到`\_`,然后又被转义一次得到空格`_`。我用“_”来清楚地表示一个空格。 (2认同)

Luk*_*vis 7

我很难将其用于包含空格的文件名的shell变量。由于某些原因使用

file="foo bar/baz"
scp user@example.com:"'$file'"
Run Code Online (Sandbox Code Playgroud)

就像@Adrian的回答似乎失败了。

事实证明,最有效的方法是使用参数扩展将反斜杠添加到空白之前,如下所示。

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"
Run Code Online (Sandbox Code Playgroud)


Vit*_*con 6

很抱歉使用这个 Linux 问题将这个提示用于 Windows 10 上的 Powershell:在这种情况下,用反斜杠转义或用引号包围的空格字符对我不起作用。效率不高,但我使用“?”解决了它 字符代替:

对于文件“tasks.txt Jun-22.bkp”,我使用“tasks.txt?Jun-22.bkp”下载了它

  • 谢谢。我来这里寻找 Powershell 解决方案,上面的方法都不起作用,但这个起作用了。 (3认同)

Jay*_*yen 5

scp ael5105@192.168.0.200:/home/5105/test/gg/Untitled?Folder/a/qy.jpg /var/www/try/

这 ?在遥控器上做一个 glob 并将匹配任何字符,包括一个空格