¿Cómo cambiar el nombre de los archivos a diferentes codificaciones?

8

Tengo 3 tipos de file namecodificaciones en el reiserfsdisco duro montado: CP1251, KOI-8, UTF-8 y ASCII. Realmente necesito convertir todas las codificaciones a UTF-8, recursivamente. ¿Hay alguna utilidad que detecte la codificación de origen y la convierta a UTF-8 o tengo que escribir el script Python?

Pablo
fuente
En el caso general, no es posible "adivinar" automáticamente la codificación del nombre (por ejemplo, la mayoría de las secuencias de bytes son nombres de archivo válidos KOI-8 y CP1251 (pero dif.)). ¿Tiene alguna pista adicional para ayudar a conocer la codificación del nombre?
Ninguna otra pista :(
Pablo
¿Tiene nombres de archivo en minúsculas y mayúsculas?
Sí, tengo nombres de archivos en minúsculas y (todos) mayúsculas.
Pablo
Alguien en necesidad? Echa un vistazo detox. Funcionó para mí entre ISO-8859-1 y UTF-8 usando-s iso8859_1-only
Alwin Kesler

Respuestas:

12

Use convmv, una herramienta CLI que convierte el nombre del archivo entre diferentes codificaciones. Para convertir de ( -f) estas configuraciones a ( -t) UTF-8, haga lo siguiente:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Además, si desea convertir el contenido del archivo, use iconvuna herramienta CLI para convertir el contenido del archivo a diferentes codificaciones. Para convertir de ( -f) estas configuraciones a ( -t) UTF-8, haga lo siguiente:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile
Marcos Roriz Junior
fuente
1
No es el contenido del archivo lo que necesito convertir, sino el nombre del archivo en sí mismo
Pablo
Bueno. ¿Intentaste convmv?
Marcos Roriz Junior
ASCII ya es un subconjunto de UTF-8, por lo que no hay necesidad de convertir.
psusi
1

No Una de las grandes desventajas del antiguo sistema de página de códigos es que no hay forma de detectar cuál se está utilizando; simplemente debes saber eso a priori. Si sabe qué archivos están usando qué codificación, entonces puede convertir los nombres usando algo como:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
fuente
Demasiados archivos para renombrar manualmente ... Pensé que las páginas de códigos tienen rangos de códigos de caracteres distintos.
Pablo
@Pablo, no, ese es el punto completo: con un byte de 8 bits solo tenía 256 códigos de caracteres posibles. Después de restar el conjunto normal de caracteres ASCII y los códigos de control que dejan 128 restantes para códigos adicionales, que no es suficiente para representar el rango completo de caracteres en todos los idiomas. Cada página de códigos hace su propio uso de esos 128 códigos superiores para representar caracteres importantes para el usuario. La única forma de averiguar cuál está en uso es intentar mostrar cada página de códigos posible y ver si el nombre parece tener sentido y eso no es algo que una computadora decida.
psusi
bueno, Python lo chardetestá detectando de alguna manera ...
Pablo
@Pablo, ordenado ... parece que hace una suposición educada basada en la prevalencia de diferentes caracteres en el lenguaje escrito. En otras palabras, supone que ciertos caracteres, como los glifos tontos, son menos populares que, digamos, una 'a' acentuada, e intenta interpretar los caracteres en cada página de códigos y encuentra el que tiene la mayoría de los códigos que coinciden con los caracteres más populares. Sin embargo, es probable que no sea muy preciso, especialmente sobre un pequeño número de caracteres, como un nombre de archivo.
psusi
0

La misma solución con iconv sugeses @psusi pero con loop y while-card:

También script de shell en línea sh:

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

Con la lectura de la tarjeta while de la tubería:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
fuente