लिनक्स पर फ़ाइल नाम की भाषा एन्कोडिंग कैसे बताएं?


17

मेरे पास एक बाहरी स्रोत से ~ 10,000 छवि फ़ाइलों के साथ एक निर्देशिका है।

कई फ़ाइलनामों में रिक्त स्थान और विराम चिह्न होते हैं जो DB के अनुकूल या वेब के अनुकूल नहीं होते हैं। मैं हर फ़ाइलनाम के अंत में (लेखांकन उद्देश्यों के लिए) एक SKU नंबर जोड़ना चाहता हूं। कई, यदि अधिकांश फ़ाइलनामों में विस्तारित लैटिन वर्ण भी नहीं होते हैं, जिन्हें मैं एसईओ उद्देश्यों के लिए रखना चाहता हूं (विशेष रूप से फ़ाइल नाम Google छवियों में फ़ाइल सामग्री का सटीक प्रतिनिधित्व करता है)

मैंने एक बैश स्क्रिप्ट बनाई है जो मेरे वांछित परिणाम के लिए सभी फाइलों का नाम बदल (कॉपी) करती है। बैश स्क्रिप्ट UTF-8 में सहेजी जाती है। इसे चलाने के बाद लगभग 500 फाइलें (स्टेटक फाइल में असमर्थ ...) को छोड़ देता है।

मैंने डायरेक्ट्री पर UTm -f UTF-8 -t UTF-8 चलाया है , और पता चला है कि ये 500 फ़ाइलनाम UTF-8 में एन्कोडेड नहीं हैं (convmv UTF-8 में पहले से ही फ़ाइल नाम का पता लगाने और उसे अनदेखा करने में सक्षम है

क्या कोई आसान तरीका है जिससे मुझे पता चल सके कि वर्तमान में वे किस भाषा के एन्कोडिंग का उपयोग कर रहे हैं?

जिस तरह से मैं खुद को यह पता लगाने में सक्षम हूं कि मेरे टर्मिनल एन्कोडिंग को यूटीएफ -8 में सेट किया गया है, फिर सभी सम्भावित उम्मीदवार एन्कोडिंग के माध्यम से तब तक के लिए पुनरावृत्ति कर लेते हैं जब तक कि यह एक परिवर्तित नाम प्रदर्शित नहीं करता है जो 'सही दिखता है'। मेरे पास यह निश्चित करने का कोई तरीका नहीं है कि ये 500 फाइलें सभी एक ही एन्कोडिंग का उपयोग करती हैं, इसलिए मुझे इस प्रक्रिया को 500 बार दोहराना होगा। मुझे 'सही लग रहा है' की तुलना में अधिक स्वचालित विधि पसंद है !!!

जवाबों:


13

वास्तव में कोई 100% सटीक तरीका नहीं है, लेकिन एक अच्छा अनुमान देने का एक तरीका है।

एक अजगर पुस्तकालय चार्ट है जो यहाँ उपलब्ध है: https://pypi.python.org/pypi/chardet

जैसे

देखें कि वर्तमान LANG चर किसके लिए निर्धारित है:

$ echo $LANG
en_IE.UTF-8

एक फ़ाइल नाम बनाएँ, जिसे UTF-8 के साथ एनकोड करना होगा

$ touch mÉ.txt

हमारे एन्कोडिंग को बदलें और देखें कि जब हम कोशिश करते हैं और इसे सूचीबद्ध करते हैं तो क्या होता है

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

ठीक है, इसलिए अब हमारे पास UTF-8 में एक फ़ाइल नाम कूटबद्ध है और हमारा वर्तमान स्थान C (मानक यूनिक्स कोडपेज) है।

तो अजगर शुरू करें, चार्ट आयात करें और इसे फ़ाइल नाम पढ़ने के लिए प्राप्त करें। मैं अपनी फ़ाइल प्राप्त करने के लिए कुछ शेल ग्लोबिंग (* वाइल्डकार्ड वर्ण के माध्यम से विस्तार) का उपयोग कर रहा हूं। जो भी आपके उदाहरण फ़ाइलों में से एक से मेल खाएगा, "ls m *" बदलें।

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

जैसा कि आप देख सकते हैं, यह केवल एक अनुमान है। "विश्वास" चर द्वारा कितना अच्छा अनुमान दिखाया गया है।


स्क्रिप्ट वर्णित के रूप में काम करती है, लेकिन मेरे मामले में, chardet को फ़ाइल की एन्कोडिंग नहीं मिली।
फेडिर RYKHTIK

6

वर्तमान कार्य निर्देशिका (अजगर 2.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'])

क्या वह एशियाई एन्कोडिंग के साथ भी काम करता है? या यह यूरेनसेंट्रिक है?
rwired
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.