目录名称中有空格时如何在ssh上进行rsync


71

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

这是详细信息

本地目录是

mnt/xlses/split/v2/name with space

远程目录是

mnt/xlses/split/v2/name with space

我已经尝试了所有可以找到的最新尝试

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

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

我打断它,发现有一个新目录

mnt/xlses/split/v2/name

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

我以为他们会在

mnt/xlses/split/v2/name with space

Answers:


8

尝试

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

/从源目录路径中删除了斜杠。这将rsync复制目录及其所有内容,这意味着您rsync将担心在远程主机上(而不是您自己)正确获取名称。


9
这对我不起作用,但johnLate的回答确实有效。
Adriaan Tijsseling 2015年

这没有说明如何处理远程端的空间。
ckujau

如前所述,这不起作用。
Lizardx

128

尝试

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

来自man rsync

-s,--protect-args

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


13
这不适用于Mac。
马特·亚历山大

8
如果您使用自制软件安装了最新版本的rsync,则可在Mac上使用。
Adriaan Tijsseling 2015年

4
通过运行man rsync并在(/s)中搜索“ --protect”,查看它是否在您的rsync版本中。要使用自制软件安装:brew install homebrew/dupes/rsync如果未找到,请运行brew search rsync
MikeiLL 2015年

12
无需安装新版本,您只需转义空格引用主机名/文件名-例如rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo 2015年

这应该是公认的答案。
Josh M.

38

这在bash中有效:用反斜杠转义空格,然后使用引号:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

或者,如果变量$ remote_path中包含路径,则可以通过替换来转义空格:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
那对我有用。使我不必在Mac服务器上工作。
乔治

1
这应该标记为正确答案。关键是您需要反斜杠和引号。
Sridhar Sarnobat '16

4
双重转义是一种痛苦,该-s选项可在任何现代版本的rsync上使用,并且旨在解决此问题
Mark K Cowan

注意:如果要从路径中带有空格的远程服务器复制到具有空间的本地路径,则只需将引号添加到远程路径
lenooh

@teekarna的解决方案为我工作。按照“ rsync”手册页,替代方法是使用“ --protect-args”或“ -s”-对我也有用。
Kishan Parekh

14

使用两对引号

不要打扰所有的反斜杠,只需在双引号内使用单引号即可

ssh me@myserver.com:"'/home/me/test file'" .

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

ssh me@myserver.com:'"/home/me/test file"' .

进一步的信息

服务器端的通配符

如果要*在服务器而不是客户端上解释a ,则*必须仅将其包含在两对引号中。我发现这是违反直觉的,因为从逻辑上说,外部一对引号转义了客户解释,而内部一对引号转义了服务器解释。

保护Args

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

rsync host:'"$HOME/test file"' .

要么

rsync host:'~"/test file"' .

注意,~后面的示例中的波浪号()必须在双引号之外

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


实际上,您关于根本不将宿主部分放在引号中的建议更具洞察力,因此很容易将其设为帖子的第一行。
Sridhar Sarnobat,

2
这个解决方案很棒!通过ssh通过rsync像在锡罐上一样工作。
Ikon

考虑一下时,两对引号是完全合乎逻辑的:外部的一对引号是这样的,以便客户端将其不可分割地对待(其内容逐字传递到服务器),内部的一对引号用于服务器认识到不可分割性。
Sridhar Sarnobat,

这个答案被低估了。
Derple

6

我知道这是一个古老的问题,但我认为我会补充现有的知识。

我已经使用rsync了多个带有空格的文件夹,并且可以使用。我的文件夹编号为1-10,如下所示:

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

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

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

    rsync -avu /media/data/The\ Folder* .
    
  2. 远程 -注意引号的存在

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

一般而言,引用参数并在参数中转义空格。在您给出的示例中,尝试:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

rsync手册页:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

好吧,我将自己回答这个问题,尽管其他人可能会更好地解释它。

显然,目标计算机上的设置会影响参数的解析方式,我们必须进行某种设置,以使其难以使用引号或斜杠来转义空格,但是我们可以使用通配符,因此我做到了

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

这对我有用,因为如果我有多个目录,那么只有一个以名称开头的目录是行不通的。

最终,我需要了解如何设置远程服务器,以便它可以更有效地解析路径名-我从不在目录名中使用空格,但是设置此文件的人确实这样做了,至少到目前为止,我一直受困于此。


您的建议仅起作用,因为您在第一次尝试(失败)时已经创建了目标目录。查看我的答案以获得更简单的方法(该方法还具有不依赖于失败的第一次尝试的优势:)。
dg99 2013年

实际上,该目录已经存在。您不正确,但尝试失败,它创建目录/〜/ name而不是/〜/ name带有空格我删除了/〜/ name并继续尝试其他选项目录/〜/ name带有空格已经存在,我正在尝试添加文件做到这一点
PyNEwbie 2013年

哦,我明白你的意思。
dg99 2013年

如果引用主机/路径并转义空格,则可以使用。
ocodo 2015年

0

根据情况,一个快速的选择是在远程系统上创建一个符号链接:

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

然后使用其中指示其跟随目录内容的-L标志rsync

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

我喜欢这种想法,有时符号链接会绕过命名错误或不必要的复杂层次结构的麻烦。
Sridhar Sarnobat,


-1

尝试这种方式:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.