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%