使用rsync或afpd将UTF-8 NFD文件名转换为UTF-8 NFC

我有一个运行FreeNAS 8的家庭文件服务器。前几天我使用rsync从Mac上传我的整个iTunes资料库,这样我就可以通过networking加载我的资料库,而不是慢速的USB驱动器。 这大部分工作,iTunes现在运行得更好,但我遇到的问题访问任何非ASCII字符的歌曲(我第一次注意到加载Queensrÿche轨道时的问题)。 这些文件将显示在Finder中,但是任何尝试访问它们都会使它们消失,直到重新连接到服务器。

经过一番研究,我发现这是因为OSX使用了Linux中不同的UTF字符顺序。 OSX文件系统使用Unicode规范化表单D(NFD),其中linux使用表单C(NFC)。 当Rsync执行从我的mac到服务器的副本时,它不会转换这些表单,现在当iTunes试图通过networking访问具有特殊字符的文件时,服务器上的文件具有错误的编码和afpd报告,不存在。

解决这个问题的最好方法是什么? 是否有可能使rsync执行unicode转换,而上传基础库到服务器? 我可以configurationafpd以NFD格式发送/接收文件名吗? 有一个简单的解决scheme来更改服务器上的文件名? 我发现了一些关于名为convmv的程序的东西,但我不知道是否可以在FreeNAS上运行。

    一些应该工作的是在源目录和挂载的远程文件系统 (SMB,NFS,AFP)之间进行rsyncing,rsync将把它视为本地文件系统。

    但是,我不知道这在实际中是如何工作的,而且你必须解决不同的问题,例如Delta传输algorithm将不会被默认使用(因为源和目标是“本地”)(也许 – 没有整个文件会工作吗?),你必须检查,例如,SMB有效地保留修改时间等。

    您可以使用rsync的--iconv选项在UTF-8 NFC和NFD之间进行转换,至less在Mac上是如此。 有一个特殊的UTF-8 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。 文件的内容不会受到影响。

    目前我正在使用rsync --iconv像这样:

    将文件从Linux服务器复制到OS X机器

    你应该从OS X机器执行这个命令:

     rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/home/username/path/on/server/' /Users/username/path/on/machine/ 

    将文件从OS X机器复制到Linux服务器

    你应该从OS X机器执行这个命令:

     rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ '[email protected]:/home/username/path/on/server/' 

    不要使用rsync将文件复制到您的NAS。 当您使用rsync复制文件时,文件名将以UTF NFD格式(即OSX格式)存储在您的NAS上,但在您的NAS上运行的Samba服务器只能理解UTF NFC格式文件名。 使用CIFS / SMB(Samba)接口复制文件,一切都会好的。