我正在尝试从一台服务器同步到另一台服务器。这些服务器具有相同的目录结构,但当远程服务器中有空格时,我无法正确识别远程服务器上的路径名。
这是详细信息
本地目录是
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/ [email protected]:/mnt/xlses/split/v2/"name with space"
当它运行时,它报告的第一件事是它正在创建一个新目录
我打断它,看到有一个新目录
mnt/xlses/split/v2/name
我的所有文件都在该目录中
我原以为他们会在
mnt/xlses/split/v2/name with space
答案1
尝试
rsync -s --size-only -avzPe ssh "/mnt/xlses/split/v2/name with space/" "[email protected]:/mnt/xlses/split/v2/name with space"
来自man rsync
(2023 年更新):
--secluded-args
,-s
此选项通过协议(而不是远程 shell 命令行)将所有文件名和大多数选项发送到远程 rsync,从而避免让远程 shell 修改它们。通配符在远程主机上通过 rsync 而不是 shell 进行扩展。
[...]
该选项曾经被调用
--protect-args
(3.2.6 之前),并且仍然可以使用旧名称(尽管将其指定为-s
始终是最简单且最兼容的选择)。
答案2
这在 bash 中有效:用反斜杠转义空格,然后使用引号:
rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .
或者,如果变量 $remote_path 中有路径,则可以通过替换来转义空格:
rsync -avuz [email protected]:"${remote_path// /\\ }" .
答案3
使用两对引号
不要理会所有的反斜杠,只需使用双引号内有单引号:
ssh [email protected]:"'/home/me/test file'" .
(推荐)也可以反过来使用,即单引号里面有双引号:
ssh [email protected]:'"/home/me/test file"' .
第二个更好,因为您可以在服务器上使用通配符(因为单引号不会在客户端上扩展)。我在尝试 rsync 具有相同前缀的多个文件时执行此操作。
更多信息
服务器端的通配符
如果您希望 a*
在服务器而不是客户端上被解释,则*
必须仅出现在 2 对引号中的一对内。我发现这违反直觉,因为从逻辑上讲,外部一对引号逃脱了客户端解释,而内部一对引号逃脱了服务器解释。
保护参数
相比之下,优点是--protect-args
解决方案,就是你实际上没有这个限制--protect-args
,所以您可以使用特殊字符,例如~
或$
。所以你可以写:
rsync host:'"$HOME/test file"' .
或者
rsync host:'~"/test file"' .
请注意,后一个示例中的波形符 ( ~
) 需要是外部双引号。
您可以在整个 username@host:file 部分周围放置一对引号(例如)ssh "[email protected]:'/home/me/test file'" .
答案4
我知道这是一个老问题,但我想我应该补充现有的知识体系。
我已经使用了rsync
多个带有空间的文件夹,这很有效。我有编号为 1-10 的文件夹,如下所示:
The\ Folder1
The\ Folder2
The\ Folder3
- ..
The\ Folder10
您想要使用的 2 个实例rsync
是本地实例和远程实例。
当地的- 请注意缺少引号。
rsync -avu /media/data/The\ Folder* .
偏僻的- 注意引号的存在
rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .