Suchen Sie nach NFD-codierten Dateinamen

557
LukeLR

Ich habe ein Verzeichnis von einem Mac zu einer Linux-Box mit Dateien und Ordnern mit Sonderzeichen (Umlauten) erstellt. Leider verwendet der Mac die NFD-Kodierung (danke Apple!), Die von rsync nicht in die NFC-Standarddateinamenkodierung konvertiert wurde. rsynclistet diese Dateien auf, z. B. Einversta?\#210ndniserkla?\#210rung.pdfwas Einverständniserklärung.pdfwährend der Übertragung sein sollte. In der Linux-Box führt dies zu doppelten Dateien, z. B. dem Ordner, der zwei Dateien mit demselben Namen enthält Einverständniserklärung.pdf(eine in NFD und eine in NFC-Codierung).

Wie kann ich alle Dateien in NFD-Kodierung finden und löschen? Dies muss möglich sein, z find. B. mit .

2

1 Antwort auf die Frage

3
grawity

Es gibt zwei Möglichkeiten:

  • Wie gefragt: Versuchen Sie, den Dateinamen in NFD umzuwandeln, und prüfen Sie, ob Sie dieselbe Ausgabe als Eingabe erhalten. Wenn Sie dies tun, ist der Dateiname bereits NFD.

  • Nützlicher: Versuchen Sie, den Dateinamen in NFC zu konvertieren, und prüfen Sie, ob Sie dasselbe Ergebnis erhalten. Wenn Sie dies nicht tun, lautet der Dateiname entweder NFD oder NFKC oder NFKD oder etwas gemischt / fehlerhaft, aber immer noch nicht ganz NFC.

Um betroffene Dateien zu finden und umzubenennen, verwenden Sie convmv :

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

Für etwas, das leichter skriptfähig ist, können Sie Perls Unicode :: Normalize verwenden :

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

So suchen Sie alle Nicht-NFC-Namen (einschließlich NFD und nicht normalisiert):

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