Isso não está funcionando porque iconv
primeiro cria o arquivo de saída (já que o arquivo já existe, ele o trunca), então começa a ler seu arquivo de entrada (que agora está vazio). A maioria dos programas se comporta dessa maneira.
Crie um novo arquivo temporário para a saída e, em seguida, mova-o para o lugar.
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
Se a iconv
da sua plataforma não tiver -o
, você poderá usar um redirecionamento de shell para o mesmo efeito.
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
Colin Watson's sponge
utility (incluído em moreutils de Joey Hess ) automatiza isso:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
Esta resposta não se aplica apenas a iconv
, mas a qualquer programa de filtro. Alguns casos especiais merecem destaque:
- O GNU sed e o Perl
-p
têm uma opção-i
para substituir os arquivos no lugar. - Se o seu arquivo é extremamente grande, seu filtro está apenas modificando ou removendo algumas partes, mas nunca adicionando coisas (por exemplo,
grep
,tr
,sed 's/long input text/shorter text/'
), e você gosta de viver perigosamente, você pode querer genuinamente < um href="https://unix.stackexchange.com/questions/11067/is-there-a-way-to-modify-a-file-inplace"> modificar o arquivo no lugar (o outras soluções mencionadas aqui criam um novo arquivo de saída e o colocam no lugar no final, portanto, os dados originais permanecem inalterados se o comando for interrompido por qualquer motivo).