当目录名称有空格时如何通过 ssh 进行 rsync

PyN*_*bie 108 ssh rsync

我正在尝试从一台服务器同步到另一台服务器。服务器具有相同的目录结构,但是当远程服务器中有空格时,我无法让远程服务器正确识别远程服务器上的路径名。

这是详细信息

本地目录是

mnt/xlses/split/v2/name with space
Run Code Online (Sandbox Code Playgroud)

远程目录是

mnt/xlses/split/v2/name with space
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能找到的最新尝试是

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"
Run Code Online (Sandbox Code Playgroud)

当它运行时,它报告的第一件事是它正在创建一个新目录

我打断它,看到有一个新目录

mnt/xlses/split/v2/name
Run Code Online (Sandbox Code Playgroud)

我的所有文件都在该目录中

我期待他们在

mnt/xlses/split/v2/name with space
Run Code Online (Sandbox Code Playgroud)

joh*_*ate 190

尝试

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"
Run Code Online (Sandbox Code Playgroud)

来自man rsync

-s, --protect-args

此选项将所有文件名和大多数选项发送到远程 rsync,而不允许远程 shell 解释它们。这意味着空格不会在名称中拆分,并且不会翻译任何非通配符特殊字符(例如 ~、$、;、& 等)。通配符由 rsync 在远程主机上扩展(而不是由 shell 执行)。[...]

  • 新版本安装是不必要的,你只需转义空格**和**引用主机/文件名 - 例如`rsync -Pavuz 'you@host:~/file\ with\ space' ./` (26认同)
  • 这不适用于 Mac。 (19认同)
  • 如果您使用 home-brew 安装最新版本的 rsync,则适用于 Mac。 (12认同)
  • 通过运行`man rsync`并搜索(`/s`)“--protect”来查看它是否在你的rsync版本中。使用自制软件安装:`brew install homebrew/dupes/rsync` 如果未找到,请运行 `brew search rsync`。 (6认同)
  • 这应该是公认的答案。 (3认同)

小智 53

这适用于 bash:用反斜杠转义空格,然后使用引号:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .
Run Code Online (Sandbox Code Playgroud)

或者,如果您在变量 $remote_path 中有路径,则可以使用替换来转义空格:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .
Run Code Online (Sandbox Code Playgroud)

  • 双重转义很痛苦,`-s` 选项适用于任何现代版本的 rsync,旨在解决这个问题 (6认同)
  • 那对我有用。让我不必在 Mac 服务器上工作。 (2认同)

Sri*_*bat 30

使用两对引号

不要理会所有的反斜杠,只需在双引号内使用单引号

ssh me@myserver.com:"'/home/me/test file'" .
Run Code Online (Sandbox Code Playgroud)

您也可以使用相反的方法,即在单引号内使用双引号

ssh me@myserver.com:'"/home/me/test file"' .
Run Code Online (Sandbox Code Playgroud)

更多信息

服务器端的通配符

如果您希望 a*在服务器上而不是在客户端上被解释,则*必须仅在两对引号中的一对内。我觉得这违反直觉,因为从逻辑上讲,外对引号会转义客户端解释,而内对引号会转义服务器解释。

保护参数

--protect-args解决方案相比,优点是您实际上没有 的限制--protect-args,因此您可以使用特殊字符,例如~$。所以你可以写:

rsync host:'"$HOME/test file"' .
Run Code Online (Sandbox Code Playgroud)

或者

rsync host:'~"/test file"' .
Run Code Online (Sandbox Code Playgroud)

请注意,~后一个示例中的波浪号 ( ) 需要在双引号之外

您可以在整个 username@host:file 部分周围放置一对引号(例如ssh "me@myserver.com:'/home/me/test file'" .

  • 这个解决方案太棒了!在 ssh 上使用 rsync 正常工作。 (2认同)

dg9*_*g99 8

尝试

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/
Run Code Online (Sandbox Code Playgroud)

/从源目录路径中去掉了尾部斜杠。这将rsync复制目录及其所有内容,这意味着rsync将担心在远程主机(它会)而不是您上获得正确的名称。

  • 这并没有解释如何处理远程端的空间。 (8认同)

小智 6

我知道这是一个老问题,但我想我会添加到现有的知识体系中。

我已经使用rsync了多个有空间的文件夹,这很有效。我的文件夹编号为 1-10,如下所示:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

您想要使用的 2 个实例rsync是本地和远程的。

  1. 本地- 请注意缺少引号。

    rsync -avu /media/data/The\ Folder* .
    
    Run Code Online (Sandbox Code Playgroud)
  2. 远程- 注意引号的存在

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    
    Run Code Online (Sandbox Code Playgroud)