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