यह काम नहीं कर रहा है क्योंकि 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
, लेकिन किसी भी फिल्टर कार्यक्रम के लिए। कुछ विशेष मामले ध्यान देने योग्य हैं:
- जीएनयू सेड और पर्ल के
-p
पास -i
जगह-जगह फाइलों को बदलने का विकल्प है।
- यदि आपकी फ़ाइल बहुत बड़ी है, अपने फिल्टर केवल संशोधित कर रहा है या कुछ भागों को हटाने, लेकिन कभी चीजों को जोड़ने (जैसे
grep
, tr
, sed 's/long input text/shorter text/'
), और आप खतरनाक तरीके से जीने की तरह है, तो आप वास्तव में कर सकते हैं जगह में फ़ाइल को संशोधित (अन्य समाधान यहाँ उल्लेख एक बनाने नई आउटपुट फ़ाइल और अंत में इसे जगह पर ले जाएं, इसलिए मूल डेटा अपरिवर्तित है यदि कमांड किसी भी कारण से बाधित है)।