我正在尝试从一台服务器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


#1 楼

尝试

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


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

评论


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

–ckujau
17年9月21日在21:36

#2 楼

尝试

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进行扩展)。
[...]



评论


这不适用于Mac。

–马特·亚历山大(Matt Alexander)
2014-09-25 21:33

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

– Adriaan Tijsseling
2015年2月9日在16:17

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

– MikeiLL
2015年6月1日于17:08

无需安装新版本,您只需转义空格并引用主机名/文件名-例如rsync -Pavuz'you @ host:〜/ file \有\空格'./

–ocodo
2015年12月11日9:33



这应该是公认的答案。

–乔什·M。
19年3月18日在23:58

#3 楼

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

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


评论


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

–乔治
2015年10月29日在20:17

应该将其标记为正确答案。关键是您需要反斜杠和引号。

– Sridhar Sarnobat
16年4月14日在17:33

两次转义很麻烦,-s选项可在任何现代版本的rsync上使用,并且旨在解决此问题。

– Mark K Cowan
16年7月23日在21:14

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

– lenooh
18-10-2在14:46

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

– Kishan Parekh
19-10-2在10:26

#4 楼

使用两对引号

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

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


也可以使用反引号,即在单引号内使用双引号: br />
如果要在服务器而不是客户端上解释*,则*必须仅位于两对引号之一内。我发现这是违反直觉的,因为从逻辑上说,外部的一对引号可以逃避客户端的解释,而内部的一对引号可以避免服务器的解释。与--protect-args解决方案相比,您实际上没有--protect-args的限制,因此可以使用特殊字符,例如~$。因此,您可以这样写:

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




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


请注意,后者中的波浪号(~)该示例需要放在双引号之外。

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

评论


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

– Sridhar Sarnobat
18年6月29日在0:26

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

– Ikon
18年7月15日在19:22

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

– Sridhar Sarnobat
18-10-12在21:16

这个答案被低估了。


19-10-11在20:31

它有时.....但是您可以在本地url和远程url上都定义:'...',因此它对一个或另一个都适用。

–mmm
19年11月7日在19:48

#5 楼

我知道这是一个古老的问题,但是我想我应该补充一下现有的知识。我的文件夹编号为1-10,如下所示:


rsync
The\ Folder1
The\ Folder2
..
The\ Folder3

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



本地-注意缺少引号。

rsync -avu /media/data/The\ Folder* .




远程-注意存在报价单

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




#6 楼

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

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


#7 楼

来自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


#8 楼

在macOS上,我必须正常转义第一个路径,第二个路径转义+引号。例如:
rsync -avhu VirtualBox\ VMs/Windows\ 10 bob@192.168.1.42:"/Users/bob/VirtualBox\ VMs/"

这是唯一在macOS上使用空格的组合。
两台机器都是macs。

评论


我认为您的意思是第二条路径必须使用引号(而不是括号)。这对于我从1台Mac转移到另一台Mac也起作用

– Mac471
1月4日7:28

Mac471:是的,这是一个错字,现在已修复!

– lenooh
1月4日14:43

#9 楼

好吧,我将自己回答这个问题,尽管其他人可能会更好地解释它。很难使用引号或斜杠来转义空格,但是我们可以使用通配符,所以我做到了这一点。



最后,我需要了解如何设置远程服务器,以便它可以更有效地解析路径名-我从不在目录名中使用空格,但是设置此功能的人确实做到了,至少现在我受困了

评论


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

– dg99
2013年12月10日23:02

实际上,该目录已经存在。您不正确,但失败了,它创建了目录/〜/ name而不是/〜/ name带有空格的地方,我删除了/〜/ name并继续尝试其他选项目录/〜/ name带有空格的存在已经在我尝试添加文件中对此

– PyNEwbie
2013年12月10日23:21



哦,我明白你的意思。

– dg99
2013年12月11日下午0:12

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

–ocodo
2015年12月11日9:34



#10 楼

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

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


评论


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

– Sridhar Sarnobat
18年6月29日在0:24

#11 楼

尝试这种方式:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;


#12 楼

rsync /mnt/xlses/split/v2/name\\ with\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\ with\\ space


双重逃逸也可以使用