convertir nombres de archivo de latin1 a utf8
Germán Poó Caamaño
gpoo en ubiobio.cl
Mar Mar 20 23:48:22 CLT 2007
On Tue, 2007-03-20 at 19:04 -0400, Alvaro Herrera wrote:
> Hola,
>
> Hace unos meses, finalmente me vencí a la presión y cambié mi sistema de
> Latin-1 a UTF8. La verdad es que pese a que no estoy contento en mi
> fuero interno con el nuevo sistema, pero me he dado cuenta que muchas
> cosas están hechas y probadas solamente en UTF8 y muestran suficientes
> bugs en Latin1 que es desagradable tener que usar "el otro sistema".
>
> Ahora el problema que tengo es que mi colección de música tiene muchos
> archivos que se llaman con letras no ASCII :-( Y no he encontrado
> ninguna forma de cambiar los nombres a UTF8. Todas las herramientas
> están enfocadas (iconv, recode) a cambiar el _contenido_ de los
> archivos, pero la verdad es que con eso no he tenido ningún problema.
>
> Así que la pregunta es: ¿sabe alguno de ustedes una fórmula mágica para
> recodificar automáticamente el nombre de los archivos? Un scriptcillo
> en shell serviría perfectamente.
>
> De hecho ya lo he intentado sin éxito: por ejemplo, un truco feo como
> meter el nombre en un archivo y recodificar dicho archivo:
>
> for file in *; do
> echo "$file" > nombre
> recode latin1..utf8 nombre
> nuevo_nombre=$(cat nombre)
> echo $nuevo_nombre
> done
>
> No funciona :-( En lugar de convertir los caracteres, los hace
> desaparecer.
En python podría ser algo como:
#!/usr/bin/env python
import string, sys, os, os.path
def utf8(str):
return unicode(str, "iso-8859-1").encode("utf-8")
if __name__ == "__main__":
for root, dirs, files in os.walk(sys.argv[1]):
for name in files:
old_name = os.path.join(root, name)
new_name = os.path.join(root, utf8(name))
os.rename(old_name, new_name)
Tiene un pequeño defecto. Asume que todo está en latin1. Es decir,
renombra todo. Pero se puede añadir algún test para determinar si la
cadena es o no latin1.
Pero puede servir para salir del paso.
--
Germán Poó Caamaño
Concepción - Chile
Más información sobre la lista de distribución Linux