查找 NFD 编码的文件名

查找 NFD 编码的文件名

我已经将 Mac 上的目录 rsync 到 Linux 机器上,其中包含带有特殊字符(变音符号)的文件和文件夹。不幸的是,Mac 使用 NFD 编码(感谢 Apple!),rsync 无法将其转换为 NFC 标准文件名编码。rsync列出这些文件,例如传输期间Einversta?\#210ndniserkla?\#210rung.pdf应有的文件Einverständniserklärung.pdf。在 Linux 机器上,这会导致文件重复,例如文件夹包含两个同名文件Einverständniserklärung.pdf(一个采用 NFD 编码,另一个采用 NFC 编码)。

如何找到所有 NFD 编码的文件并删除它们?这必须是可能的,例如通过使用find

答案1

有两种方法:

  • 问题如下:尝试将文件名转换为 NFD,看看输出是否与输入相同。如果相同,则文件名已经是 NFD。

  • 更有用:尝试将文件名转换为近场通信,看看是否得到相同的结果。如果没有,则文件名是 NFD 或 NFKC 或 NFKD 或混合/格式错误,但仍然不是 NFC。

要查找并重命名受影响的文件,请使用康维

convmv -f utf-8 -t utf-8 --nfc ...

对于更容易编写脚本的东西,你可以使用 Perl 的Unicode::规范化

find -type f | perl -C -MUnicode::Normalize -n -e'print if $_ eq NFD($_)'

查找所有非 NFC 名称(包括 NFD 和未规范化的名称):

find -type f | perl -C -MUnicode::Normalize -n -e'print if $_ ne NFC($_)'

相关内容