Come dire la codifica della lingua di un nome file su Linux?


17

Ho una directory con ~ 10.000 file di immagini da una fonte esterna.

Molti nomi di file contengono spazi e segni di punteggiatura che non sono DB friendly o Web friendly. Voglio anche aggiungere un numero SKU alla fine di ogni nome di file (a fini contabili). Molti, se non la maggior parte dei nomi di file contengono anche caratteri latini estesi che desidero conservare per scopi SEO (in particolare, quindi i nomi dei file rappresentano accuratamente i contenuti del file in Google Immagini)

Ho creato uno script bash che rinomina (copia) tutti i file con il risultato desiderato. Lo script bash viene salvato in UTF-8. Dopo l'esecuzione omette circa 500 file (impossibile eseguire il file stat ...).

Ho eseguito convmv -f UTF-8 -t UTF-8 nella directory e ho scoperto che questi 500 nomi di file non sono codificati in UTF-8 (convmv è in grado di rilevare e ignorare i nomi di file già in UTF-8)

Esiste un modo semplice per scoprire quale codifica lingua stanno attualmente utilizzando?

L'unico modo in cui sono stato in grado di capire me stesso è impostare la codifica del mio terminale su UTF-8, quindi scorrere tutte le possibili codifiche candidate con convmv fino a quando non viene visualizzato un nome convertito che "sembra giusto". Non ho modo di essere certo che questi 500 file utilizzino tutti la stessa codifica, quindi dovrei ripetere questo processo 500 volte. Vorrei un metodo più automatizzato di "sembra giusto" !!!

Risposte:


13

Non esiste un modo preciso al 100%, ma c'è un modo per fare una buona ipotesi.

Esiste un chardet di libreria python che è disponibile qui: https://pypi.python.org/pypi/chardet

per esempio

Guarda su che cosa è impostata la variabile LANG corrente:

$ echo $LANG
en_IE.UTF-8

Crea un nome file che dovrà essere codificato con UTF-8

$ touch mÉ.txt

Cambia la nostra codifica e guarda cosa succede quando proviamo ad elencarla

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

OK, quindi ora abbiamo un nome file codificato in UTF-8 e la nostra locale corrente è C (tabella codici Unix standard).

Quindi avviare Python, importare chardet e farlo leggere il nome del file. Sto usando un po 'di globbing della shell (ovvero espansione attraverso il carattere jolly *) per ottenere il mio file. Cambia "ls m *" in qualsiasi cosa corrisponda a uno dei tuoi file di esempio.

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

Come puoi vedere, è solo una supposizione. Quanto è buona una supposizione mostrata dalla variabile "confidenza".


lo script funziona come descritto, ma nel mio caso chardet non ha trovato la codifica del file.
Fedir RYKHTIK,

6

Questo può essere utile per testare l'attuale directory di lavoro (python 2.7):

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

Il risultato è simile a:

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

Per richiamare il percorso attraverso la directory corrente, taglialo e incollalo in un piccolo script Python:

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

Funziona anche con la codifica asiatica? O è Eurocentrico?
cablato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.