Як сказати кодування мови імені файлу в Linux?


17

У мене є каталог із ~ 10000 файлів зображень із зовнішнього джерела.

Багато імен файлів містять пробіли та розділові знаки, які не є дружніми до БД або веб-переглядача. Я також хочу додати номер SKU до кінця кожного імені файлу (з метою обліку). Багато, якщо не більшість імен файлів, також містять розширені латинські символи, які я хочу зберегти для цілей SEO (зокрема, щоб файли точно відображали вміст файлу в Google Images)

Я створив скрипт bash, який перейменовує (копіює) всі файли до бажаного результату. Сценарій bash зберігається в UTF-8. Після запуску він пропускає близько 500 файлів (не вдається встановити файл ...).

Я запустив convmv -f UTF-8 -t UTF-8 у каталозі, і виявив, що ці 500 імен файлів не закодовані в UTF-8 (convmv здатний виявляти та ігнорувати імена файлів уже в UTF-8)

Чи є простий спосіб я дізнатися, яку кодову мову вони зараз використовують?

Єдиний спосіб, який я зміг зрозуміти, - це встановити кодування свого терміналу на UTF-8, а потім повторювати всі можливі кодування кандидата з convmv, поки не з’явиться перетворене ім'я, яке "виглядає правильно". Я не можу бути впевненим, що всі ці 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 (стандартна кодова сторінка Unix).

Отже, запускайте python, імпортуйте chardet і змушуйте його читати ім'я файлу. Для отримання файлу я використовую деякий глобус оболонки (тобто розширення через символ * wildcard). Змініть "ls m *" на те, що буде відповідати одному з ваших прикладних файлів.

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

Як бачите, це лише здогадки. Наскільки гарна здогадка, показує змінна "впевненість".


скрипт працює як описано, але в моєму випадку chardet не знайшов кодування файлу.
Федір РИХТИК

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'])

Це також працює з азіатським кодуванням? Або це євроцентричний?
rwired
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.