2

У меня есть rsync'd каталог с Mac на ящик 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 ответ1

3

Есть два способа:

  • В ответ на вопрос: попробуйте преобразовать имя файла в NFD и посмотрите, получите ли вы тот же вывод, что и для ввода. Если вы это сделаете, имя файла уже NFD.

  • Более полезно: попробуйте преобразовать имя файла в NFC и посмотрите, получите ли вы тот же результат. Если вы этого не сделаете, имя файла будет либо NFD, либо NFKC, либо NFKD, либо что-то смешанное / неправильное, но все же не совсем NFC.

Чтобы найти и переименовать затронутые файлы, используйте convmv:

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

Для чего-то более легкого в написании сценариев вы можете использовать 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($_)'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .