রূপান্তরিত আউটপুটটির সাথে আমি কীভাবে ইনকুট ফাইলটি প্রতিস্থাপন করতে পারি?


69

আমার কাছে একটি বাশ স্ক্রিপ্ট রয়েছে যা ডিরেক্টরিতে প্রতিটি *। Php ফাইলের মাধ্যমে অঙ্ক করে এবং 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কোনও ফিল্টার প্রোগ্রামে নয়। কয়েকটি বিশেষ ক্ষেত্রে উল্লেখযোগ্য:

  • গনুহ sed এবং পার্ল -pএকটি আছে -iজায়গায় ফাইলগুলি প্রতিস্থাপন করার অপশন।
  • তাহলে আপনার ফাইল অত্যন্ত বড়, আপনার ফিল্টার শুধুমাত্র পরিবর্তন হয় বা কিছু অংশ মুছে ফেলার কিন্তু কখনও কিছু যোগ করার (যেমন grep, tr, sed 's/long input text/shorter text/'), এবং আপনি বিপজ্জনকভাবে বসবাস মতো, আপনি সত্যি সত্যি করতে পারেন জায়গায় ফাইল পরিবর্তন (অন্যান্য সমাধান এখানে উল্লেখ তৈরি নতুন আউটপুট ফাইল এবং শেষে এটিকে স্থানান্তরিত করে, সুতরাং কোনও কারণে কমান্ড বাধা দিলে আসল তথ্য অপরিবর্তিত থাকে)।

3
এর লেখকতাকে spongeবিশেষভাবে জোয়ে হেসের জন্য দায়ী করা উচিত কিনা তা আমি নিশ্চিত নই ; এটি সেই প্যাকেজটিতে moreutilsঅন্তর্ভুক্ত রয়েছে spongeযা তিনি বজায় রাখেন, তবে spongeহোম পেজ থেকে প্রাপ্ত লিঙ্কগুলি অনুসরণ করে, এর উত্স সম্পর্কিত moreutils, আমি খুঁজে পেয়েছি যে এটি কলিন ওয়াটসনের অন্তর্ভুক্তির জন্য পোস্ট করেছেন এবং পরামর্শ দিয়েছেন : "জো নতুন লেখার অভাব সম্পর্কে লিখেছেন যে ইউনিক্স দর্শনে ফিট করুন I've আমি লিখেছি এমন জিনিসগুলির মধ্যে আমার প্রিয় sponge"(সোম, 06 ফেব্রুয়ারী 2006)।
ইম্জ - ইভান জ্যাকারিয়াশেভ

3
আমি ম্যাক ওএস ব্যবহার করি, আইকনভিভ-এ কোনও বিকল্প নেই, আমাকে `আইকনভি-ফ সিপি 1251 -t utf8 -o"। ফাইল.নিউ "" "$ ফাইল" `থেকেiconv -f cp1251 -t utf8 "$file" > "$file.new"
কোড

কিছু কমান্ড যেমন প্যারামিটার sortসম্পর্কে বেশ স্মার্ট -oএবং যদি তারা আউটপুট ফাইল সনাক্ত করে তবে তারা অভ্যন্তরীণভাবে একটি টেম্প ফাইল পরিচালনা করে যাতে এটি ঠিক কাজ করে।
jesjimher

56

একটি বিকল্প হ'ল recode, যা কিছু রূপান্তরগুলির জন্য লাইবিকনভ লাইব্রেরি ব্যবহার করে। এর আচরণ হ'ল আউটপুটটির সাথে ইনপুট ফাইলটি প্রতিস্থাপন করা, সুতরাং এটি কাজ করবে:

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

recodeএকাধিক ইনপুট ফাইলকে প্যারামিটার হিসাবে গ্রহণ করার সাথে সাথে আপনি forলুপটি ছাড়িয়ে নিতে পারেন :

recode cp1251..utf8 *.php

2
ধন্যবাদ, এটি আরও উন্নয়নের দাবিদার। এনকোডিংগুলির মধ্যে 2 বিন্দু সম্পর্কে ম্যানুয়ালটিতে কোথায়
তাকানো হয়েছে তা কেবলই ভাবছেন

2
"অনুরোধটি প্রায়শই পূর্বের চেয়ে আগে দেখা যায় ... এর আগে এবং চার্সেট হওয়ার পরে।" এই ম্যানুয়ালটি সেই সমস্ত ডাবল বিন্দু (যা সিনট্যাক্সের অংশ) এবং ট্রিপল ডট (যার অর্থ এর আরও বেশি) অনুসরণ করা সত্যই শক্ত। একটি পরামর্শ: info recodeপরিবর্তে চেষ্টা করুন। আরও ভার্বোজ হয়।
manatwork

4

আপাতত

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

একটি যাদুমন্ত্র মত কাজ করে


5
প্রথমদিকে, আমি সত্যিই চিন্তা করেছিলাম এটি কার্যকর হয়। তবে দেখা যাচ্ছে যে 32 কে ছাড়িয়ে যাওয়া আউটপুট কেটে গেছে এবং আরও বেশি ইনপুট দিয়ে এটি কোর ডাম্পগুলিকে ট্রিগার করে।
x-yuri

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

জিএনইউ দিয়ে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.