สิ่งนี้ไม่ทำงานเนื่องจาก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
โปรแกรมอรรถประโยชน์ของ Colin Watson (รวมอยู่ในโปรแกรมเพิ่มเติมของ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/'
) และคุณชอบใช้ชีวิตอันตรายคุณอาจต้องการที่แท้จริงแก้ไขไฟล์ในสถานที่ (แก้ปัญหาอื่น ๆ ที่กล่าวถึงที่นี่สร้าง ไฟล์เอาต์พุตใหม่และย้ายไปไว้ที่ท้ายดังนั้นข้อมูลต้นฉบับจะไม่เปลี่ยนแปลงหากคำสั่งถูกขัดจังหวะด้วยเหตุผลใดก็ตาม)