Bu işe yaramıyor çünkü iconv
ilk önce çıktı dosyasını yaratıyor (dosya zaten mevcut olduğundan onu kısaltıyor), sonra giriş dosyasını okumaya başladı (şimdi boş). Çoğu program bu şekilde davranır.
Çıktı için yeni, geçici bir dosya oluşturun, sonra yerine yerleştirin.
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
Platformunuzun iconv
yoksa -o
, aynı etkiye bir kabuk yeniden yönlendirme kullanabilirsiniz.
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
Colin Watson'ın sponge
yardımcı programı ( Joey Hess'in daha fazla içeriğine dahil edilmiş ) bunu otomatikleştirir:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
Bu cevap sadece iconv
herhangi bir filtre programına uygulanmaz. Birkaç özel durumdan bahsetmeye değer:
- GNU sed ve Perl
-p
, -i
dosyaları yerinde değiştirme seçeneğine sahiptir.
- Dosyanız çok büyükse, filtreniz yalnızca bazı kısımları değiştiriyor veya kaldırıyor, ancak hiçbir şey eklemiyor (örn
grep
. tr
, sed 's/long input text/shorter text/'
) Ve tehlikeli bir şekilde yaşamaktan hoşlanıyorsanız , dosyayı yerinde gerçekten değiştirmek isteyebilirsiniz (burada belirtilen diğer çözümler bir yeni çıktı dosyasını alın ve sonunda yerine yerleştirin, böylece herhangi bir nedenle komut kesilirse orijinal veriler değiştirilmez).