Как переименовать имена файлов в другую кодировку?

8

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

Pablo
источник
В общем случае невозможно автоматически «угадать» кодировку имени (например, большинство байтовых последовательностей являются допустимыми именами файлов KOI-8 и CP1251 (но различаются)). У вас есть дополнительная подсказка, чтобы помочь узнать кодировку имени?
Никакой другой подсказки :(
Пабло
У вас есть как строчные, так и прописные имена файлов?
Да, у меня есть как строчные, так и (все) прописные имена файлов.
Пабло
Кто-нибудь нуждается? Проверьте detox. У меня это работало между ISO-8859-1 и UTF-8 с использованием-s iso8859_1-only
Alwin

Ответы:

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
Мне нужно конвертировать не содержимое файла, а само имя файла
Pablo
Ладно. Вы пробовали convmv?
Маркос Рорис Младший
ASCII уже является подмножеством UTF-8, поэтому нет необходимости конвертировать.
Psusi
1

Нет. Одним из больших недостатков старой системы кодовых страниц является то, что нет способа определить, какая из них используется; Вы должны просто знать, что априори. Если вы знаете, какие файлы используют какую кодировку, вы можете преобразовать имена, используя что-то вроде:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
источник
Слишком много файлов, чтобы переименовать вручную ... Я думал, что кодовые страницы имеют разные диапазоны кодов символов.
Пабло
@ Пабло, нет, в этом весь смысл: с 8-битным байтом у вас было только 256 возможных кодов символов. После вычитания нормального набора символов ASCII и управляющих кодов оставляется 128, оставленных для дополнительных кодов, что недостаточно для представления полного диапазона символов на всех языках. Каждая кодовая страница по-своему использует эти верхние 128 кодов для представления символов, важных для пользователя. Единственный способ выяснить, какая из них используется, - это попытаться отобразить каждую возможную кодовую страницу и посмотреть, имеет ли название смысл, а не является ли это чем-то компьютерным и решающим.
Псуси
хорошо, питон chardetкак-то обнаруживает это ...
Пабло
@Pablo, опрятный ... похоже, что он делает обоснованное предположение, основанное на распространенности различных символов в письменном языке. Другими словами, он предполагает, что определенные символы, такие как тупые глифы, менее популярны, чем, скажем, акцентированное «а», и пытается интерпретировать символы в каждой кодовой странице и находит тот, который имеет наибольшее количество кодов, которые соответствуют более популярным символам. Это, вероятно, не очень точно, особенно по небольшому количеству символов, таких как имя файла.
Псуси
0

То же решение, iconvчто и для @psusi sugeses, но с циклом и while-картой:

Также oneline shell shскрипт:

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

С чтением пока-карты из трубопровода:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
источник