Найти NFD-кодированные имена файлов

479
LukeLR

У меня есть 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.

2

1 ответ на вопрос

3
grawity

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

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

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

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

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

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

Похожие вопросы