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%