查找NFD编码的文件名


2

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

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

Answers:


3

有两种方法:

  • 如上所述:尝试将文件名转换为NFD,并查看是否获得与输入相同的输出。如果这样做,文件名已经是NFD。

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

要查找和重命名受影响的文件,请使用convmv

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

对于更容易编写脚本的东西,您可以使用Perl的Unicode :: Normalize

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($_)'
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.