Localizar nomes de arquivos codificados em NFD

2

Eu rsync'd um diretório de um Mac para uma caixa linux contendo arquivos e pastas com caracteres especiais (umlauts). Infelizmente, o Mac usa a codificação NFD (obrigado, Apple!), Que o rsync não converteu na codificação de nome de arquivo padrão NFC. rsync lista esses arquivos como, por exemplo, Einversta?\#210ndniserkla?\#210rung.pdf , o que deve ser Einverständniserklärung.pdf durante a transferência. Na caixa linux, isso leva a arquivos duplicados, por ex. a pasta contendo dois arquivos com o mesmo nome Einverständniserklärung.pdf (um no NFD e outro na codificação NFC).

Como posso encontrar todos os arquivos na codificação do NFD e excluí-los? Isso deve ser possível, por ex. usando find .

    
por LukeLR 18.03.2018 / 04:51

1 resposta

3

Existem duas maneiras:

  • Conforme solicitado: tente converter o nome do arquivo em NFD e veja se você obtém a mesma saída que a entrada. Se você fizer isso, o nome do arquivo já é NFD.

  • Mais útil: tente converter o nome do arquivo para NFC e veja se você obtém o mesmo resultado. Se você não o fizer, o nome do arquivo será NFD ou NFKC ou NFKD ou algo misto / malformado, mas ainda assim não será exatamente NFC.

Para localizar e renomear arquivos afetados, use convmv :

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

Para algo mais fácil de escrever, você pode usar o Unicode :: Normalize do Perl:

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

Para localizar todos os nomes não-NFC (incluindo NFD e não-normalizados):

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