eliminar de forma recursiva todos los caracteres no válidos de los archivos de texto en su lugar

0

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

Soy consciente de que se han formulado muchas preguntas similares anteriormente, como: cómo eliminar caracteres no UTF-8 del archivo de texto pero no he encontrado uno que sea recursivo y que funcione en su lugar.

    
pregunta pingu 09.04.2016 - 00:01

2 respuestas

3

Lo mejor de los comandos UNIX es que puedes combinarlos juntos. iconv no sabe cómo intervenir en directorios, pero find lo hace. Puede llamar a iconv en cada archivo que ve.

(Estos comandos convertirán todos los archivos en el directorio actual y todos dentro. Asegúrese de estar en el directorio en el que desea 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 $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'
find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'%pre%' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename"
    done
' filename; do iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8 mv "$filename".iconv_cleaned_utf8 "$filename" done
' filename; do iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename" done
' 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 archivos de los archivos involucrados, 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 archivo y los recorre
  • iconv convierte el archivo en un archivo temporal con una extensión adicional
  • we mv the tempfile para reemplazar el archivo original.

Si tienen diferentes extensiones (esto es para cualquiera y todos los archivos en el directorio actual), elimine el -name *.txt

Es un poco más limpio si tienes la utilidad sponge de moreutils , pero eso no está instalado de forma predeterminada.

%pre%     
respondido por el 0942v8653 09.04.2016 - 05:04
0

Es posible que esto no responda a toda la pregunta, pero he sido un usuario feliz de BBEdit durante muchos años (al menos Pre-OSX ...). Lo uso para piratear HTML y abrir de vez en cuando archivos que no puedo entender.

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

Y es de secuencias de comandos masiva, pero no libre. Puede que valga la pena investigar para ver si hará lo que usted quiere.

    
respondido por el Steve Chambers 09.04.2016 - 01:11

Lea otras preguntas en las etiquetas