লিনাক্সে ফাইলের নামের এনকোডিংটি কীভাবে বলা যায়?


17

বাহ্যিক উত্স থেকে 10,000 ডলারের ইমেজ ফাইল সহ আমার একটি ডিরেক্টরি আছে।

অনেক ফাইল নামেই ফাঁকা স্থান এবং বিরাম চিহ্ন রয়েছে যা ডিবি বান্ধব বা ওয়েব বান্ধব নয়। আমি প্রতিটি ফাইলের শেষে (অ্যাকাউন্টিংয়ের উদ্দেশ্যে) একটি এসকিউ নম্বর যুক্ত করতে চাই। অনেকগুলি যদি না হয় তবে বেশিরভাগ ফাইলের নামের মধ্যে বর্ধিত লাতিন অক্ষরও রয়েছে যা আমি এসইও উদ্দেশ্যে রাখতে চাই (বিশেষত ফাইলের নামগুলি Google চিত্রগুলিতে ফাইলের সামগ্রীগুলি নিখুঁতভাবে উপস্থাপন করে)

আমি একটি বাশ স্ক্রিপ্ট তৈরি করেছি যা আমার কাঙ্ক্ষিত ফলাফলের সমস্ত ফাইলের নাম (অনুলিপি) করে। ব্যাশ স্ক্রিপ্টটি ইউটিএফ -8 এ সংরক্ষিত হয়েছে। এটি চালানোর পরে এটি প্রায় 500 টি ফাইল বাদ দেয় (ফাইল স্থিতিতে অক্ষম ...)।

আমি ডিরেক্টরিতে কনফিভ -f ইউটিএফ -8 -টি ইউটিএফ -8 চালিয়েছি এবং আবিষ্কার করেছি যে এই 500 টি ফাইলের নাম ইউটিএফ -8 এ এনকোড করা হয়নি (কনফ্যাম ইতিমধ্যে ইউটিএফ -8 এ থাকা ফাইলের নামগুলি সনাক্ত এবং উপেক্ষা করতে সক্ষম)

তারা বর্তমানে কোন ভাষা এনকোডিং ব্যবহার করছে তা খুঁজে পাওয়ার কোনও সহজ উপায় আছে ?

আমি নিজেই এটির সন্ধান করতে পেরেছি তা হল আমার টার্মিনাল এনকোডিংটি ইউটিএফ -8 এ সেট করে, তারপরে কনফের সাহায্যে সমস্ত সম্ভাব্য প্রার্থীর এনকোডিংগুলি দিয়ে পুনরুক্তি করা যতক্ষণ না এটি রূপান্তরিত নামটি প্রদর্শিত হয় যা 'সঠিক দেখাচ্ছে'। আমার নিশ্চিত হওয়ার কোনও উপায় নেই যে এই 500 টি ফাইলই সমস্ত একই এনকোডিং ব্যবহার করে, সুতরাং আমার এই প্রক্রিয়াটি 500 বার পুনরাবৃত্তি করতে হবে। আমি 'ঠিক দেখাচ্ছে' এর চেয়ে আরও একটি স্বয়ংক্রিয় পদ্ধতি চাই !!!

উত্তর:


13

সত্যিকারের কোনও 100% সঠিক উপায় নেই তবে একটি ভাল অনুমান দেওয়ার উপায় রয়েছে।

এখানে পাইথন লাইব্রেরি চারডেট পাওয়া যায়: https://pypi.python.org/pypi/chardet

যেমন

বর্তমান ল্যাং ভেরিয়েবলটি কী সেট করা আছে তা দেখুন:

$ echo $LANG
en_IE.UTF-8

এমন একটি ফাইল নাম তৈরি করুন যা আপনাকে ইউটিএফ -8 দিয়ে এনকোড করা দরকার

$ touch mÉ.txt

আমাদের এনকোডিং পরিবর্তন করুন এবং দেখুন যখন আমরা চেষ্টা করে এটি তালিকাভুক্ত করি তখন কী ঘটে

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

ঠিক আছে, সুতরাং এখন আমাদের কাছে ইউটিএফ -8 এ একটি ফাইলের নাম এনকোড করা আছে এবং আমাদের বর্তমান লোকেলটি সি (স্ট্যান্ডার্ড ইউনিক্স কোডেপেজ)।

সুতরাং পাইথন শুরু করুন, চার্ডিট আমদানি করুন এবং এটি ফাইলের নামটি পড়তে পান। আমি আমার ফাইল পেতে কিছু শেল গ্লোব্বিং (অর্থাত্ * ওয়াইল্ডকার্ড চরিত্রের মাধ্যমে প্রসারিত) ব্যবহার করছি। "Ls m *" কে আপনার উদাহরণের ফাইলগুলির মধ্যে যে কোনওটির সাথে মিলবে।

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

আপনি দেখতে পাচ্ছেন, এটি কেবল অনুমান মাত্র। "আত্মবিশ্বাস" ভেরিয়েবল দ্বারা কতটা ভাল অনুমান করা যায়।


স্ক্রিপ্ট বর্ণিত হিসাবে কাজ করে, কিন্তু আমার ক্ষেত্রে, চারডেট ফাইলের এনকোডিং খুঁজে পায়নি।
ফেদির আরওয়াইকটিক

6

বর্তমান কার্যকারী ডিরেক্টরিটি (অজগর ২.7) পরীক্ষা করতে আপনি এটি দরকারী খুঁজে পেতে পারেন:

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

ফলাফলটি দেখে মনে হচ্ছে:

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

বর্তমান ডিরেক্টরি থেকে ট্রাথ পাথ পুনরাবৃত্তি করতে, এটি একটি অল্প অজগর স্ক্রিপ্টে কাটা-পেস্ট করুন:

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

এটি কি এশিয়ান এনকোডিংয়ের সাথেও কাজ করে? নাকি এটি ইউরোসেন্ট্রিক?
rwided
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.