Esto no funciona porque iconv
primero crea el archivo de salida (dado que el archivo ya existe, lo trunca), luego comienza a leer su archivo de entrada (que ahora está vacío). La mayoría de los programas se comportan de esta manera.
Cree un nuevo archivo temporal para la salida, luego muévalo a su lugar.
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
Si su plataforma iconv
no tiene -o
, puede usar una redirección de shell para el mismo efecto.
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
La sponge
utilidad de Colin Watson (incluida en moreutils de Joey Hess ) automatiza esto:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
Esta respuesta se aplica no solo iconv
a cualquier programa de filtro, sino también a él. Vale la pena mencionar algunos casos especiales:
- GNU sed y Perl
-p
tienen una -i
opción para reemplazar archivos en su lugar.
- Si el archivo es muy grande, el filtro sólo está modificando o eliminando algunas partes, pero nunca añadir cosas (por ejemplo
grep
, tr
, sed 's/long input text/shorter text/'
), y te gusta vivir peligrosamente, es posible que desee realmente modificar el archivo en su lugar (las otras soluciones mencionadas aquí crean una nuevo archivo de salida y muévalo a su lugar al final, de modo que los datos originales no cambien si el comando se interrumpe por cualquier motivo).