Це не працює, оскільки iconv
спочатку створюється вихідний файл (оскільки файл вже існує, він усікає його), а потім починає читати вхідний файл (який тепер порожній). Більшість програм поводяться таким чином.
Створіть новий, тимчасовий файл для виводу, а потім перемістіть його на місце.
for file in *.php
do
iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
mv -f "$file.new" "$file"
done
Якщо на вашій платформі iconv
немає -o
, ви можете скористатися перенаправленням оболонок для того ж ефекту.
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
mv -f "$file.new" "$file"
done
sponge
Утиліта Коліна Уотсона (включена в додаткові програми Joey Hess ) автоматизує це:
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
Ця відповідь стосується не лише iconv
будь-якої програми фільтра. Варто згадати кілька особливих випадків:
- GNU sed і Perl
-p
мають -i
можливість замінити файли на місці.
- Якщо файл дуже великий, ваш фільтр не тільки зміна або видалення деяких частин , але ніколи не додавати речі (наприклад
grep
, tr
, sed 's/long input text/shorter text/'
), і вам подобається жити небезпечно, ви можете дійсно змінити файл в місці (інші рішення , згадані тут , створюють новий вихідний файл і перемістіть його на місце в кінці, тому вихідні дані не змінюються, якщо команда перервана з будь-якої причини).