จะบอกการเข้ารหัสภาษาของชื่อไฟล์บน Linux ได้อย่างไร


17

ฉันมีไดเรกทอรีที่มีไฟล์รูปภาพประมาณ 10,000 ไฟล์จากแหล่งภายนอก

ชื่อไฟล์จำนวนมากมีช่องว่างและเครื่องหมายวรรคตอนที่ไม่เป็นมิตรกับ DB หรือเป็นมิตรกับเว็บ ฉันต้องการเพิ่มหมายเลข SKU ต่อท้ายชื่อไฟล์ทุกชื่อ (เพื่อวัตถุประสงค์ด้านการบัญชี) ส่วนมากถ้าไม่ใช่ชื่อไฟล์ส่วนใหญ่จะมีตัวอักษรละตินแบบขยายซึ่งฉันต้องการเก็บไว้เพื่อการทำ SEO (โดยเฉพาะดังนั้นชื่อไฟล์จะแสดงเนื้อหาไฟล์ใน Google Images อย่างถูกต้อง)

ฉันสร้างสคริปต์ทุบตีซึ่งเปลี่ยนชื่อ (คัดลอก) ไฟล์ทั้งหมดเป็นผลลัพธ์ที่ต้องการ สคริปต์ทุบตีจะถูกบันทึกใน UTF-8 หลังจากเรียกใช้แล้วจะมีไฟล์ประมาณ 500 ไฟล์ (ไม่สามารถแปลงไฟล์ ... )

ฉันเรียกใช้convmv -f UTF-8 -t UTF-8ในไดเรกทอรีและพบว่าชื่อไฟล์ 500 ชื่อเหล่านี้ไม่ได้เข้ารหัสใน UTF-8 (Convmv สามารถตรวจจับและละเว้นชื่อไฟล์ที่มีอยู่แล้วใน UTF-8)

มีวิธีที่ง่ายที่ฉันสามารถหาที่เข้ารหัสภาษาที่พวกเขากำลังใช้?

วิธีเดียวที่ฉันสามารถคิดออกเองได้คือการตั้งค่าการเข้ารหัสเทอร์มินัลเป็น UTF-8 จากนั้นวนซ้ำการเข้ารหัสผู้สมัครที่มีโอกาสทั้งหมดด้วย convmv จนกว่าจะแสดงชื่อที่แปลงแล้วว่า 'ถูกต้อง' ฉันไม่มีวิธีที่จะมั่นใจได้ว่าไฟล์ 500 ไฟล์เหล่านี้ทั้งหมดใช้การเข้ารหัสเดียวกันดังนั้นฉันจะต้องทำซ้ำขั้นตอนนี้ 500 ครั้ง ฉันต้องการวิธีการอัตโนมัติมากกว่า 'ดูสิ'

คำตอบ:


13

ไม่มีวิธีที่ถูกต้อง 100% จริงๆ แต่มีวิธีที่จะคาดเดาได้ดี

มีห้องสมุด chython ซึ่งมีอยู่ที่นี่: 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 (เพจ Unix codepage มาตรฐาน)

ดังนั้นเริ่มต้นไพ ธ อนนำเข้า chardet และนำไปอ่านชื่อไฟล์ ฉันใช้เชลล์ globbing (เช่นการขยายผ่านอักขระ wildcard *) เพื่อรับไฟล์ของฉัน เปลี่ยน "ls m *" เป็นสิ่งที่จะจับคู่หนึ่งในไฟล์ตัวอย่างของคุณ

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

อย่างที่คุณเห็นมันเป็นเพียงการเดา การเดาจะแสดงได้ดีเพียงใดโดยตัวแปร "มั่นใจ"


สคริปต์ทำงานได้ตามที่อธิบายไว้ แต่ในกรณีของฉัน chardet ไม่พบการเข้ารหัสไฟล์
Fedir RYKHTIK

6

คุณอาจพบว่ามีประโยชน์ในการทดสอบไดเรกทอรีการทำงานปัจจุบัน (python 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)

ในการเรียกคืนพา ธ รางน้ำจากไดเรกทอรีปัจจุบันให้ตัดและวางสิ่งนี้ลงในสคริปต์ python เล็กน้อย:

#!/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'])

มันใช้ได้กับการเข้ารหัสแบบเอเชียด้วยหรือไม่ หรือว่า Eurocentric
rwired
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.