Làm thế nào để nói mã hóa ngôn ngữ của một tên tệp trên Linux?


17

Tôi có một thư mục với ~ 10.000 tệp hình ảnh từ một nguồn bên ngoài.

Nhiều tên tệp chứa khoảng trắng và dấu chấm câu không thân thiện với DB hoặc thân thiện với Web. Tôi cũng muốn nối một số SKU vào cuối mỗi tên tệp (cho mục đích kế toán). Nhiều người, nếu không phải hầu hết các tên tệp cũng chứa các ký tự Latin mở rộng mà tôi muốn giữ cho mục đích SEO (cụ thể là tên tệp thể hiện chính xác nội dung tệp trong Google Images)

Tôi đã tạo một tập lệnh bash để đổi tên (bản sao) tất cả các tệp thành kết quả mong muốn của tôi. Tập lệnh bash được lưu trong UTF-8. Sau khi chạy, nó bỏ qua khoảng 500 tệp (không thể thống kê tệp ...).

Tôi đã chạy convmv -f UTF-8 -t UTF-8 trên thư mục và phát hiện ra 500 tên tệp này không được mã hóa trong UTF-8 (convmv có thể phát hiện và bỏ qua tên tệp đã có trong UTF-8)

Có một cách dễ dàng Tôi có thể tìm hiểu ngôn ngữ mã hóa hiện tại họ đang sử dụng?

Cách duy nhất tôi có thể tự mình tìm ra là bằng cách đặt mã hóa đầu cuối của mình thành UTF-8, sau đó lặp qua tất cả các mã hóa ứng cử viên có khả năng với confmv cho đến khi nó hiển thị một tên được chuyển đổi 'có vẻ đúng'. Tôi không có cách nào để chắc chắn rằng tất cả 500 tệp này đều sử dụng cùng một mã hóa, vì vậy tôi sẽ cần phải lặp lại quá trình này 500 lần. Tôi muốn một phương pháp tự động hơn là "có vẻ đúng" !!!

Câu trả lời:


13

Thực sự không có cách nào chính xác 100%, nhưng có một cách để đưa ra dự đoán tốt.

Có một thư viện python có sẵn ở đây: https://pypi.python.org/pypi/chardet

ví dụ

Xem những gì biến LANG hiện tại được đặt thành:

$ echo $LANG
en_IE.UTF-8

Tạo một tên tệp cần được mã hóa bằng UTF-8

$ touch mÉ.txt

Thay đổi mã hóa của chúng tôi và xem điều gì xảy ra khi chúng tôi thử và liệt kê nó

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

OK, vì vậy bây giờ chúng tôi có một tên tệp được mã hóa bằng UTF-8 và ngôn ngữ hiện tại của chúng tôi là C (mã hóa Unix tiêu chuẩn).

Vì vậy, hãy khởi động python, nhập chardet và lấy nó để đọc tên tệp. Tôi đang sử dụng một số toàn cầu shell (tức là mở rộng thông qua ký tự * ký tự đại diện) để lấy tệp của mình. Thay đổi "ls m *" thành bất cứ thứ gì sẽ khớp với một trong các tệp ví dụ của bạn.

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

Như bạn có thể thấy, đó chỉ là một phỏng đoán. Làm thế nào tốt một dự đoán được hiển thị bởi các biến "tự tin".


tập lệnh hoạt động như mô tả, nhưng trong trường hợp của tôi, chardet không tìm thấy mã hóa tập tin.
Fedir RYKHTIK

6

Bạn có thể thấy điều này hữu ích, để kiểm tra thư mục làm việc hiện tại (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'])

Kết quả trông giống như:

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)

Để lặp lại đường dẫn máng từ thư mục hiện tại, hãy cắt và dán nó vào một tập lệnh python nhỏ:

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

Điều đó có làm việc với mã hóa châu Á không? Hay là Eurrialric?
rwired
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.