0 votos

Eliminar recursivamente todos los caracteres no válidos de los archivos de texto en su lugar

Tengo varios miles de archivos de texto, algunos de los cuales contienen caracteres UTF-8 no válidos. Quiero eliminar recursivamente todos los caracteres no válidos de estos archivos en su lugar.

Soy consciente de que ya se han planteado muchas preguntas similares, como por ejemplo cómo eliminar los caracteres no UTF-8 de un archivo de texto pero no he encontrado ninguno que sea recursivo y que funcione en el lugar.

4voto

0942v8653 Puntos 3617

Lo bueno de los comandos UNIX es que puedes combinarlos entre sí. iconv no sabe cómo recurrir a los directorios, pero find lo hace. Puede llamar a iconv en cada archivo que ve.

(Estos comandos convertirán todos los archivos del directorio actual y todo directorios dentro. Asegúrese de que está en el directorio en el que quiere convertir todos los archivos de forma recursiva).

Para cambiar todos los archivos con la extensión .txt :

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8
        mv "$filename".iconv_cleaned_utf8 "$filename"
    done

Supongo que este código requiere alguna explicación. Lo que hace es:

  • find imprime todos los nombres de los archivos implicados, separados por un byte nulo (el byte nulo es el único carácter no válido para una ruta de archivo)
  • bash read s los nombres de los archivos y los recorre en bucle
  • iconv convierte el archivo en un archivo temporal con una extensión extra
  • nosotros mv el archivo temporal para reemplazar el archivo original.

Si tienen diferentes extensiones (esto es para todos y cada uno de los archivos bajo el directorio actual), elimine el -name *.txt

Es un poco más limpio si tienes el sponge utilidad de moreutils pero no está instalado por defecto.

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename"
    done

0voto

Steve Chambers Puntos 5054

Puede que esto no responda a toda la pregunta, pero he sido un feliz usuario de BBEdit durante bastantes años (al menos antes de OSX...). Lo uso para hackear HTML y para abrir ocasionalmente archivos que no puedo entender.

Tiene esta bonita función llamada Zap Gremlins, que básicamente elimina un montón de caracteres extraños y no ASCII de cualquier archivo. Lo cual se parece mucho a lo que necesitas hacer.

Y es masivamente scriptable, pero no es gratis. Puede ser vale la pena investigar para ver si hace lo que quieres.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X