Найти NFD-кодированные имена файлов
У меня есть 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 ответ
Есть два способа:
В ответ на вопрос: попробуйте преобразовать имя файла в 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($_)'