Ini tidak berfungsi karena iconv
pertama-tama membuat file output (karena file sudah ada, memotongnya), kemudian mulai membaca file inputnya (yang sekarang kosong). Sebagian besar program berperilaku seperti ini.
Buat file sementara yang baru untuk output, lalu pindahkan ke tempatnya.
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
Jika platform iconv
Anda tidak memiliki -o
, Anda dapat menggunakan pengalihan shell untuk efek yang sama.
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
sponge
Utilitas Colin Watson (termasuk dalam moreutils Joey Hess ) mengotomatisasi ini:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
Jawaban ini berlaku tidak hanya untuk iconv
tetapi untuk program filter apa pun. Beberapa kasus khusus perlu disebutkan:
- GNU sed dan Perl
-p
memiliki -i
opsi untuk mengganti file di tempat.
- Jika file Anda sangat besar, filter Anda hanya memodifikasi atau menghapus beberapa bagian tetapi tidak pernah menambahkan hal-hal (misalnya
grep
, tr
, sed 's/long input text/shorter text/'
), dan Anda seperti tinggal berbahaya, Anda mungkin ingin benar-benar memodifikasi file di tempat (solusi lain yang disebutkan di sini membuat file output baru dan pindahkan ke tempatnya di akhir, sehingga data asli tidak berubah jika perintah terputus karena alasan apa pun).