এটি কাজ করছে না কারণ 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
ইউটিলিটি ( জোয়ে হেসের মুর্টিলগুলিতে অন্তর্ভুক্ত ) এটিকে স্বয়ংক্রিয়ভাবে নিযুক্ত করে :
for file in *.php
do
iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done
এই উত্তরটি কেবলমাত্র iconv
কোনও ফিল্টার প্রোগ্রামে নয়। কয়েকটি বিশেষ ক্ষেত্রে উল্লেখযোগ্য:
- গনুহ sed এবং পার্ল
-p
একটি আছে -i
জায়গায় ফাইলগুলি প্রতিস্থাপন করার অপশন।
- তাহলে আপনার ফাইল অত্যন্ত বড়, আপনার ফিল্টার শুধুমাত্র পরিবর্তন হয় বা কিছু অংশ মুছে ফেলার কিন্তু কখনও কিছু যোগ করার (যেমন
grep
, tr
, sed 's/long input text/shorter text/'
), এবং আপনি বিপজ্জনকভাবে বসবাস মতো, আপনি সত্যি সত্যি করতে পারেন জায়গায় ফাইল পরিবর্তন (অন্যান্য সমাধান এখানে উল্লেখ তৈরি নতুন আউটপুট ফাইল এবং শেষে এটিকে স্থানান্তরিত করে, সুতরাং কোনও কারণে কমান্ড বাধা দিলে আসল তথ্য অপরিবর্তিত থাকে)।