Це не працює, оскільки 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/'), і вам подобається жити небезпечно, ви можете дійсно змінити файл в місці (інші рішення , згадані тут , створюють новий вихідний файл і перемістіть його на місце в кінці, тому вихідні дані не змінюються, якщо команда перервана з будь-якої причини).