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


8

У мене є 3 типи file nameкодувань на reiserfsвстановленому жорсткому диску: CP1251, KOI-8, UTF-8 та ASCII. Мені дійсно потрібно конвертувати всі кодування в UTF-8, рекурсивно. Чи є якась утиліта, яка виявить кодування джерела та перетворить його в UTF-8 або мені доведеться писати сценарій Python?


У загальному випадку неможливо автоматично «відгадати» кодування імен (наприклад, більшість послідовностей байтів є дійсними іменами KOI-8 та CP1251 (але відмінними)). Чи є у вас додаткові підказки, які допоможуть дізнатися кодування імен?

Ніякої іншої підказки :(
Пабло

У вас є і малі, і великі імена файлів?

Так, у мене є і малі, і великі імена файлів у верхньому регістрі.
Пабло

Хтось потребує? Перевірте detox. Він працював для мене між ISO-8859-1 та UTF-8, використовуючи-s iso8859_1-only
Альвін Кеслер,

Відповіді:


12

Використовуйте convmv, інструмент CLI, який перетворює ім'я файлу між різними кодуванням. Щоб перетворити з ( -f) ці приналежності в ( -t) UTF-8, виконайте наступне:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Крім того, якщо ви хочете конвертувати вміст файлу, використовуйте iconvінструмент CLI для перетворення вмісту файлів у різні кодування. Щоб перетворити з ( -f) ці приналежності в ( -t) UTF-8, виконайте наступне:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
Мені потрібно конвертувати не вміст файлів, а сама назва файлу
Пабло

Добре. Ви спробували convmv?
Маркос Роріз-молодший

ASCII вже є підмножиною UTF-8, тому не потрібно перетворювати.
psusi

1

Ні. Одним із великих недоліків старої системи кодових сторінок є те, що немає способу визначити, який саме використовується; ви повинні просто знати це апріорі. Якщо ви знаєте, які файли використовують кодування, то ви можете перетворити імена, використовуючи щось на зразок:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

Занадто багато файлів для перейменування вручну ... Я думав, що на сторінках коду є різні діапазони коду символів.
Пабло

@Pablo, ні, в цьому і полягає вся суть: з 8-бітового байта у вас було лише 256 можливих кодів символів. Після віднімання звичайного набору символів ASCII та контрольних кодів у вас залишається 128 для додаткових кодів, що недостатньо для представлення повного діапазону символів на всіх мовах. Кожна сторінка коду використовує ті верхні 128 кодів, щоб представити важливі для користувача символи. Єдиний спосіб розібратися, що використовується - спробувати відобразити кожну можливу кодову сторінку і побачити, чи є ім'я має сенс, і це не щось, що комп'ютер, і вирішити.
psusi

ну, пітон chardetякось це виявляє ...
Пабло

@Pablo, акуратно ... виглядає так, що це дає освіту здогадуватися на основі поширеності різних символів у письмовій мові. Іншими словами, це передбачає, що певні символи, як, наприклад, глухі гліфи, менш популярні, ніж скажімо, наголос "а", і намагаються інтерпретувати символи на кожній кодовій сторінці і знаходять той, який має найбільше кодів, які відповідають більш популярним символам. Це, мабуть, не дуже точно, особливо для невеликої кількості символів, наприклад, імені файлу.
psusi

0

Те саме рішення, що і iconvв sugeses @psusi, але з петлею та карткою while:

Також однолінійний shсценарій оболонки :

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

З читанням карти карти while з трубопроводу:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.