在 rsync 或 afpd 中将 UTF-8 NFD 文件名转换为 UTF-8 NFC

在 rsync 或 afpd 中将 UTF-8 NFD 文件名转换为 UTF-8 NFC

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

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

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

答案1

笔记:如果您使用的是 rsync 3.0.0 或更新版本,那么--iconv其他答案中提到的选项显然是更好的解决方案。

一些东西应该工作是在源目录和挂载远程文件系统(SMB、NFS、AFP),rsync 将其视为本地文件系统。

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

答案2

您可以使用 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。文件的内容不会受到影响。

答案3

目前我正在使用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/'

答案4

根据我的经验,我建议使用 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

相关内容