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