Convirtiendo Archivos y Charsets (en Linux)

Hoy me he topado con la necesidad de:

  1. Determinar el charset (o codificación ó collation) de todos los archivos de tipo web (.php, .js y .html) de un determinado directorio y extraer sólo los que usan ISO-8859-1, y
  2. Convertir la codificación de dischos archivos, de ISO-8859-1 a UTF-8

Para el primer problema, desde un inicio pensé en usar el comando file, pero al correrlo sin parámetros file nombredelarchivo.ext me devolvía sólo el tipo de archivo, más no el charset que buscaba, al leer la página de ayuda del file man file y luego de probar con varios modificadores, probé con el -i que me presenta un poco más de info, incluyendo el charset 🙂

Para el segundo problema, una búsqueda rápida en linuxcmd.org, me indicó que existía recode que transforma un archivo de un charset a otro, la lista de charsets que maneja es bien grande, aunque a mí me interesaban sólo ISO-8859-1 y UTF-8 …

Indagando un poco más, ví de reojo por ahí (en el google), que se podía hacer lo mismo con iconv, aunque decidí quedarme con recode. A la  larga terminé haciendo un script muy sencillo que resuelve mi problema específico: me coloco en un directorio cualquiera, corro el script y obtengo una recodificación a UTF-8 de todos los archivos web ahí que originalmente eran ISO-8859-1:

#!/bin/bash
FILETYPES="php js html"
for FTYPE in $FILETYPES; do
  FILES=`find -name "*.$FTYPE"`
  for FILE in $FILES; do
    CHARSET=`file -i $FILE | awk -F"charset=" {'print $2'}`
    if [ ${CHARSET} = "iso-8859-1" ]; then
      echo " --- ${FILE} es ISO-8859-1 ---"
      recode ISO-8859-1..UTF-8 $FILE
    fi
  done
done

Por último, hay que notar que el recode no es un paquete que suela instalarse por defecto en el Linux, de no estar, habría que ponerlo:

[root@dv2315 ~]# yum install recode