Mac 和 Linux 之间无法使用特殊字符文件的 Rsync

Mac 和 Linux 之间无法使用特殊字符文件的 Rsync

我想使用 rsync 备份我的 Ubuntu 服务器,其中磁盘位于 Mac 上。但我无法让它正常工作,因为每次在初始时间之后我重新运行 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,我更新了我的 Mac 上的 rsync 版本从 2.6.9 到 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]

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

编辑:让我补充一点,当我(在 Mac 上,请注意)启动从 Mac 到 Linux 的 rsync 时,一切都运行良好:

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

但是从 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]

包括非常奇怪的说法[server=2.6.9],尽管我在 Mac 上已更新到 3.1.1。出于某些原因,看起来我的 Linux 机器在 Mac 上只“看到”原始的 rsync 版本。

关于如何解决这个问题有什么建议吗?

答案1

解决方案非常简单:由于我在研究该问题时读到的一条评论,我认为你应该按转换顺序指定字符集;但这似乎不是正确的语法。相反,应该总是--iconv=utf-8-mac,utf-8在从 mac 初始化 rsync 时使用,并且总是在从 Linux 机器初始化 rsync 时使用--iconv=utf-8,utf-8-mac,无论我想从 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.

答案2

我可以确认这有效,我遇到了同样的问题。就我而言,任何带有重音字符的文件在目标上都无法读取。我只能在我的 Mac 上使用“比较文件夹”应用程序运行文件夹比较才能发现它: https://itunes.apple.com/gb/app/compare-folders/id816042486?mt=12

添加了上述 --iconv=utf-8-mac,utf-8 然后 BOOM!rsync 将每个带重音符号的文件替换为新的文件。

由于上述链接似乎不再有效,因此需要添加一些信息,将 rsync 升级到 3.1.2,安装 Macports 并运行:sudo port install rsync

您看到远程服务器返回版本 2.6.9 的原因是因为旧版本实际上仍然存在,并且远程服务器看到的是旧版本而不是新版本。

版本 2.6.9 位于 /usr/bin

相关内容