在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,我从2.6.9版本升级到了3.1.1版本的rsync。然而,我还没有完全解决问题,因为现在我遇到了另一个错误:
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.x.x之后的版本,所以应该支持--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版本。
有什么建议可以解决这个问题吗?
2个回答

解决方案非常简单:在研究问题时,我读到了一条评论,认为应该按照转换的顺序指定字符集;但似乎这不是正确的语法。相反,当从Mac初始化rsync时,应始终使用--iconv=utf-8-mac,utf-8,而当从Linux机器初始化rsync时,无论我想要从Mac还是Linux机器同步文件,都应始终使用--iconv=utf-8,utf-8-mac
然后,它就像魔术般地工作了!
编辑:事实上,有时候仔细查看手册页是一个好习惯。这就是它,白纸黑字:
--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.

嗯...这对我来说是从Ubuntu到Amazon S3的问题... :| - Tom Roggero
没关系!AWS CLI已经为我修复了它。 - Tom Roggero
白字黑底 ;) - Hello World
这对于umlauts来说很好用,但对于文件名中的(一些?)表情符号不适用。 - idleberg

我可以确认这个方法有效,我之前也遇到了同样的问题。在我的情况下,任何带有重音字符的文件在目标位置都无法读取。我是通过在我的Mac上使用Compare Folders应用程序运行文件夹比较才发现的: 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目录下。