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


24

我有一台运行FreeNAS 8的家庭文件服务器。几天前,我使用rsync从Mac上传了整个iTunes库,以便可以通过网络加载我的库,而不必使用慢速的USB驱动器。这通常可以正常工作,并且iTunes现在运行得更好,但是访问任何包含非ASCII字符的歌曲时遇到了问题(我在加载Queensrÿche曲目时首先注意到了这个问题)。这些文件将显示在Finder中,但是任何尝试访问它们的操作都会使它们消失,直到我重新连接到服务器为止。

经过研究后,我发现这是因为OSX使用与Linux不同的UTF字符顺序。OSX文件系统使用Unicode规范化形式D(NFD),而linux使用形式C(NFC)。当Rsync执行从我的mac到服务器的复制时,Rsync不会转换这些形式。现在,当iTunes尝试通过网络访问带有特殊字符的文件时,服务器上的文件编码错误,并且afpd报告不正确。不存在。

解决此问题的最佳方法是什么?在将基本库上传到服务器时,可以使rsync执行unicode转换吗?我可以配置afpd以NFD格式发送/接收文件名吗?有没有简单的解决方案来更改服务器上的文件名?我发现了有关名为convmv的程序的一些信息,但我不知道是否可以在FreeNAS上运行它。


1
听起来像OS X版本的rsync的错误。
伊格纳西奥·巴斯克斯

Answers:


4

注意:如果您正在使用3.0.0或更高版本的rsync,--iconv则其他答案中提到的选项显然是更好的解决方案。

东西应该工作的源目录之间rsyncing和安装的远程文件系统(SMB,NFS,AFP),它的rsync只会当作本地文件系统。

但是,我不知道这在实际中的效果如何,您必须解决不同的问题,例如,默认情况下将不使用增量传输算法(因为源和目标是“本地”)(也许-是否没有完整文件?),您必须检查,例如SMB是否有效地保留了修改时间,等等。


最终,这就是我最终要做的。我从NAS删除了整个集合,然后使用本地安装的CIFS连接而不是NAS上的rsync守护程序再次运行rsync。现在,我只是解决文件名大写的iTunes问题。:/
ChiperSoft

50

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


1
我不是原始海报,所以这不取决于我,但这是一个比标记为已接受的解决方案更干净,有效的解决方案。一定要对此加注星标,将非常有用。
ItsGC 2012年

1
好答案;我不知道UTF8-MACNFD是什么意思。当与iconv它本身一起使用时,这提供了一种在NFC和NFD之间来回转换的通用机制。
mklement 2014年

很好的答案,这解决了将Mac与Linux服务器同步的长期存在的问题!
meduz

2
在Mac上,您可能还需要brew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz '16

我得到rsync: --iconv: unknown option
KMC

7

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

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

您应该从OS X计算机执行以下命令:

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/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/ 'username@server.ip.address.here:/home/username/path/on/server/'

0

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


0

根据我的经验,我建议使用SMB而不是ssh。Iconv解决了编码问题,但是在不同的系统上允许的字符仍然存在问题:

在Mac上的原始文件名:

https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s

通过SMB通过rsync复制后:

-as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s

通过ssh通过rsync复制后(带有不带iconv标志的ant):

-as seen by Mac (over SMB):     H0INHQ~6
-as seen by Ubuntu (over SMB):  H0INHQ~6
-as seen by Windows10 (over SMB):   H0INHQ~6
-as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.