带有特殊字符文件的 Rsync 在 Mac 和 Linux 之间不起作用

Nic*_*ede 25 mac backup rsync 12.04

我想使用 rsync 用驻留在 Mac 上的磁盘备份我的 Ubuntu 服务器。但是我没有让它正常工作,因为每次我在初始时间之后重新运行 rsync 操作时,都会首先删除带有特殊字符的文件,然后重新同步。似乎不同的字符集有问题。

首选的解决方案似乎是使用--iconv选项:

您可以使用 rsync 的 --iconv 选项在 UTF-8 NFC 和 NFD 之间进行转换,至少如果您使用的是 Mac。有一个特殊的 utf-8-mac 字符集代表 UTF-8 NFD。因此,要将文件从 Mac 复制到 NAS,您需要运行以下命令:

rsync -a --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/

这会将远程服务器上的所有本地文件名从 UTF-8 NFD 转换为 UTF-8 NFC。文件的内容不会受到影响。

感谢@Jan,我从 2.6.9更新了我的 mac 上的 rsync 版本。到 3.1.1。尽管如此,我仍然没有完全到位,因为我现在收到一个进一步的错误:

iconv_open("UTF-8", "utf-8-mac") failed
rsync error: requested action not supported (code 4) at rsync.c(118) [sender=3.0.9]
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么“不支持请求的操作”,因为我的 Ubuntu (12.04) 上的 rsync 版本似乎是 3.xx 之后的版本,因此应该支持该--iconv选项。

编辑:让我补充一点,当我(在 Mac 上,nota bene)启动从 Mac 到 Linux 的 rsync 时,一切正常:

rsync -av --delete --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Run Code Online (Sandbox Code Playgroud)

但是从 Mac 走另一条路是行不通的。奇怪的是,测试从 linux 机器启动 rsync 会呈现以下奇怪的消息:

rsync: on remote machine: --iconv=UTF-8-MAC: unknown option
rsync error: syntax or usage error (code 1) at /SourceCache/rsync/rsync-45/rsync/main.c(1333) [server=2.6.9]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
Run Code Online (Sandbox Code Playgroud)

包括非常奇怪的声明[server=2.6.9],虽然我已经在 Mac 上更新到 3.1.1。由于某些原因,看起来我的 linux 机器在 Mac 上只能“看到”原始 rsync 版本。

关于如何解决这个问题的任何建议?

Nic*_*ede 26

解决方案非常简单:由于我在研究问题时阅读的评论,我认为您应该按照转换顺序指定字符集;但这似乎不是正确的语法。相反,人们应该总是--iconv=utf-8-mac,utf-8初始化从Mac rsync的时候,和总是使用--iconv=utf-8,utf-8-mac初始化从Linux机器rsync的时候,不管我想从Mac或Linux的机器同步文件。

然后它就像魔术一样工作!

编辑:确实,有时,仔细检查手册页是一件好事。这是白底黑字:

--iconv=CONVERT_SPEC
              Rsync  can  convert  filenames between character sets using this
              option.  Using a CONVERT_SPEC of "." tells rsync to look up  the
              default  character-set via the locale setting.  Alternately, you
              can fully specify what conversion to do by giving a local and  a
              remote   charset   separated   by   a   comma   in   the   order
              --iconv=LOCAL,REMOTE, e.g.  --iconv=utf8,iso88591.   This  order
              ensures  that the option will stay the same whether you're push-
              ing  or  pulling  files.
Run Code Online (Sandbox Code Playgroud)