【问题标题】:How do I escape spaces in path for scp copy in Linux?如何在 Linux 中转义 scp 复制路径中的空格?
【发布时间】:2013-11-20 09:51:45
【问题描述】:

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

我试过了:

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

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

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

【问题讨论】:

  • 再次检查文件是否确实存在。在整个路径周围加上引号,包括登录名和 IP 地址。或者,远程引用引号并在空格前加上反斜杠。

标签: linux unix ubuntu whitespace scp


【解决方案1】:

作品

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

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

没用

scp localhost:'f/a b c' .

原因是该字符串在路径传递给 scp 命令之前由 shell 解释。因此,当它到达遥控器时,遥控器正在寻找带有非转义引号的字符串,但它失败了

要查看实际情况,请使用 -vx 选项启动一个 shell,即bash -vx,它会在运行时显示该命令的插值版本。

【讨论】:

【解决方案2】:

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

您可以选择几个选项(在 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 .

【讨论】:

  • 这非常小,但在 Mac 和终端等大多数控制台应用程序中,有一个“粘贴转义文本”选项。因此,我使用了第二个选项。
  • ' " path " ' 工作,而 " ' path ' " 失败;结论先用单引号,再用双引号括起来
  • 哇!这可能是我见过的最荒谬的程序行为!
  • @jankes 这并非没有优点。事实上,你放在那里的是一个 shell 命令参数,这样你就可以使用scp user@example.com:'$(ls -t | head -1)' . 来获取服务器中最近创建的文件,或者使用scp user@example.com:'dir/*.{xml,pdf}' . 从远程目录获取所有 xml 和 pdf 文件。一般来说,我更喜欢这个而不是方便使用有空格的文件。带空格的文件总是很麻烦。
  • 为什么是逃逸2次?有什么办法可以改变这种行为?
【解决方案3】:

你也可以这样做:

scp foo@bar:"\"apath/with spaces in it/\""

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

【讨论】:

  • 这个答案被低估了,考虑到它可以用相同数量的转义字符处理多少个空格。谢谢!
  • 被低估了。不需要解析修改路径!!!
【解决方案4】:

我很难让它适用于包含带有空格的文件名的 shell 变量。出于某种原因使用:

file="foo bar/baz"
scp user@example.com:"'$file'"

@Adrian 的回答似乎失败了。

事实证明,最好的方法是使用参数扩展在空格前添加反斜杠,如下所示:

file="foo bar/baz"
file=${file// /\\ }
scp user@example.com:"$file"

【讨论】:

  • 我建议使用更强大的“全部替换”扩展:file="${file//\ /\\\ }"
  • 忘记了那个区别——我对我的参数扩展感到生疏了。谢谢!
  • 我没有变量,但这让我很满意,因为它可以替代 3 个反斜杠,用于有很多空格的路径。没有人有时间!
  • ${file//\ /\\\ } 是否比${file// /\\ } 更好?该空间是否出于某种原因需要逃逸?
  • @opello 不,没有必要转义空格。已经确定了答案。
【解决方案5】:

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

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

应将名为directory with spaces 的远程目录中的file 复制到您的Downloads 目录。

【讨论】:

  • 这是唯一一个在 Ubuntu 19.10 上为我工作的。没有双引号,没有软引号和硬引号,没有转义引号。只有tripplebackslashed空格。很奇怪。谢谢!
  • 大吃一惊。我什至从未听说过使用三重反斜杠。这是在 Ubuntu 18 上唯一对我有用的东西。有人可以解释为什么以及何时需要这样做吗?如果它仅用于 scp 或有其他情况,您需要使用三个反斜杠而不是一个?
  • 见@AdrianGunawan 的answer。它在本地主机上转义一次,然后在远程主机上第二次转义。所以\\\_ 被转义一次得到\_,然后又被转义一次得到一个空格_。我用_ 来清楚地表示一个空格。
【解决方案6】:

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

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

【讨论】:

  • 谢谢。我来这里是为了寻找 Powershell 解决方案,但上述方法都不起作用,但确实如此。
【解决方案7】:

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

那个?在遥控器上执行 glob 并将匹配任何字符,包括空格

【讨论】:

    【解决方案8】:

    我在尝试使用 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>
    

    注意:没有选项 -T 可以正常工作。

    【讨论】:

      【解决方案9】:

      如果文件或文件夹名称之间有空格,那么您只需在空格前添加一个黑色斜杠 '',然后将整个路径放在单引号 ('') 内,它就可以工作了。

      例子:

      假设文件夹名称是'Test Folder'并且它在远程机器的/home/里面。然后您可以使用以下 scp 命令访问或下载该文件夹。

      scp -r <user>@<host>:'/home/Test\ Folder' .
      

      【讨论】:

        【解决方案10】:

        我是 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) 的文件。抱歉我的解释,我希望有人能理解,我希望这对需要其他解决方案的人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-21
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2013-08-01
          • 2011-04-13
          • 2015-07-18
          • 2016-05-21
          相关资源
          最近更新 更多