मैं परिवर्तित आउटपुट के साथ इनपुट फ़ाइल को आइकॉन कैसे बदल सकता हूं?


69

मेरे पास एक बैश स्क्रिप्ट है जो एक निर्देशिका में हर * .php फ़ाइल के माध्यम से enumerates और उस पर लागू iconvहोती है। इससे STDOUT में आउटपुट मिलता है।

चूंकि -oपैरामीटर (मेरे अनुभव में) जोड़ने से वास्तव में रूपांतरण होने से पहले शायद एक रिक्त फ़ाइल लिखता है, मैं अपनी स्क्रिप्ट को कैसे समायोजित कर सकता हूं ताकि यह रूपांतरण करता है, फिर इनपुट फ़ाइल को ओवरराइट करता है?

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file"
done

जवाबों:


76

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

3
मुझे पूरा यकीन नहीं है कि क्या spongeजॉय हेस को विशेष रूप से जिम्मेदार ठहराया जाना चाहिए; यह वह पैकेज moreutilsहै जिसमें spongeवह शामिल है, लेकिन मूल के संबंध में sponge, के होमपेज से लिंक का पालन करके moreutils, मैंने पाया है कि यह मूल रूप से कॉलिन वाटसन द्वारा शामिल किए जाने के लिए पोस्ट और सुझाव दिया गया है: "जॉय नए उपकरणों की कमी के बारे में लिखते हैं कि यूनिक्स दर्शन में फिट। मेरी लिखी गई ऐसी चीजों का मेरा पसंदीदा है sponge"(सोम, 06 फरवरी 2006)।
इम्ज़ - इवान ज़खरीशेव

3
मैं मैक ओएस का उपयोग, वहाँ iconv में कोई -ओ विकल्प है, मैं `iconv -f CP1251 बदलना होगा आयकर UTF8 -ओ" $ file.new "" $ फ़ाइल "` करने के लिएiconv -f cp1251 -t utf8 "$file" > "$file.new"
code4j

कुछ कमांड, जैसे sort, -oपैरामीटर के विषय में बहुत स्मार्ट हैं , और यदि वे आउटपुट फ़ाइल का पता लगाते हैं तो इनपुट के समान है जो वे आंतरिक रूप से एक अस्थायी फ़ाइल का प्रबंधन करते हैं इसलिए यह बस काम करता है।
jesjimher

56

एक विकल्प है recode, जो कुछ रूपांतरणों के लिए लिबीकॉन लाइब्रेरी का उपयोग करता है। इसका व्यवहार इनपुट फ़ाइल को आउटपुट के साथ बदलना है, इसलिए यह काम करेगा:

for file in *.php
do
    recode cp1251..utf8 "$file"
done

के रूप में recodeपैरामीटर के रूप में एकाधिक इनपुट फ़ाइलों को स्वीकार करता है, तो आप अतिरिक्त कर सकते हैं forपाश:

recode cp1251..utf8 *.php

2
धन्यवाद, यह अधिक उत्थान के योग्य है। बस सोच रहा था कि एन्कोडिंग के बीच के 2 डॉट्स के बारे में मैनुअल में कहां-कहां ...
न्यूरोिनो

2
"वास्तव में अक्सर BEFORE..AFTER जैसा दिखता है, BEFORE और AFTER चार्ट के साथ।" यह मैनुअल वास्तव में उन सभी डबल डॉट्स (जो सिंटैक्स का हिस्सा है) और ट्रिपल डॉट्स (जो इस से अधिक है) के साथ पालन करना कठिन है। एक सलाह: info recodeइसके बजाय प्रयास करें । अधिक क्रिया है।
मैनटवर्क

4

अभी के लिए

find . -name '*.php' -exec iconv -f CP1251 -t UTF-8 {} -o {} \;

एक जादू की तरह काम करता है


5
सबसे पहले, मैंने वास्तव में सोचा था कि यह काम करता है। लेकिन यह प्रतीत होता है कि 32K से अधिक का आउटपुट कट जाता है, और इससे भी अधिक इनपुट के साथ यह कोर डंप को ट्रिगर करता है।
एक्स-यूरी

1

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '%!iconv -f cp1251 -t utf8' -cx "$file"
  1. % सभी लाइनों का चयन करें

  2. ! चलाने के आदेश

  3. x सहेजें और बंद करें


0

यहाँ एक सरल उदाहरण है । इसे शुरू करने के लिए आपको एक पर्याप्त जानकारी देनी चाहिए।

#!/bin/bash
#conversor.sh
#Author.....: dede.exe
#E-mail.....: dede.exe@gmail.com
#Description: Convert all files to a another format
#             It's not a safe way to do it...
#             Just a desperate script to save my life...
#             Use it such a last resort...

to_format="utf8"
file_pattern="*.java"

files=`find . -name "${file_pattern}"`

echo "==================== CONVERTING ===================="

#Try convert all files in the structure
for file_name in ${files}
do
        #Get file format
        file_format=`file $file_name --mime-encoding | cut -d":" -f2 | sed -e 's/ //g'`

        if [ $file_format != $to_format ]; then

                file_tmp="${unit_file}.tmp"

                #Rename the file to a temporary file
                mv $file_name $file_tmp

                #Create a new file with a new format.
                iconv -f $file_format -t $to_format $file_tmp > $file_name

                #Remove the temporary file
                rm $file_tmp

                echo "File Name...: $file_name"
                echo "From Format.: $file_format"
                echo "To Format...: $to_format"
                echo "---------------------------------------------------"

        fi
done;

0
echo "`iconv -f cp1251 -t utf8 $file`" > "$file"

मेरे लिये कार्य करता है


0

आप पा सकते हैं, कम से कम यह मेरे लिए रास्पियन स्ट्रेच पर काम करता है:

find . -type f -name '*php' -execdir iconv -f cp1251 -t UTF-8 '{}' -o '{}'.tmp \; -execdir mv '{}'.tmp '{}' \;

0

एक विकल्प के लिए संपादन के लिए perlइंटरफ़ेस iconvऔर उसके -iमोड का उपयोग करना है:

perl -MText::Iconv -i -pe '
  BEGIN{$i=Text::Iconv->new(qw(cp1252 UTF-8));$i->raise_error(1)}
  $_ = $i->convert($_)' ./*.php

GNU के साथ awk, आप कुछ ऐसा भी कर सकते हैं:

gawk -v cmd='iconv -f cp1252 -t utf-8' -i inplace '
  {print | cmd}; ENDFILE {close(cmd)}' ./*.php

ksh93खोल भी एक है >;जो एक अस्थायी फ़ाइल जो पुनः निर्देशित फाइल करने के लिए बदल दिया गया है, तो आदेश सफल रहा था में उत्पादन संग्रहीत करता है कि के लिए ऑपरेटर:

for f in *.php; do
  iconv -f cp1252 -t utf-8 < $f >; $f
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.