Python. Скрипт для транслитерации имен списка файлов с русскими названиями.
Думаю, объяснять, почему это реализовано на Python - не требуется... А потому, сразу к делу. Само собой разумеется задействуем модуль os, который позволит получить список файлов в каталоге и предоставит функцию для переименования.
import os
Так как смысл программы в том, чтобы переделать русские буквы в латинские (или их сочетания), потребуется сделать некую функцию, которая будет посимвольно обрабатывать строку и заменять русские буквы на латинские. Для этого создадим в том же каталоге, гдебудет лежать основной скрипт еще один файл - rusconv.py - со следующим содержанием.
# -*- coding: cp1251 -*- def convertChar(str): nname = '' for c in str: if (c == 'а') | (c == 'А'): nname += 'a' if (c == 'б') | (c == 'Б'): nname += 'b' if (c == 'в') | (c == 'В'): nname += 'v' if (c == 'г') | (c == 'Г'): nname += 'g' if (c == 'д') | (c == 'Д'): nname += 'd' if (c == 'е') | (c == 'Е'): nname += 'e' if (c == 'ё') | (c == 'Ё'): nname += 'e' if (c == 'ж') | (c == 'Ж'): nname += 'j' if (c == 'з') | (c == 'З'): nname += 'z' if (c == 'и') | (c == 'И'): nname += 'i' if (c == 'й') | (c == 'Й'): nname += 'i' if (c == 'к') | (c == 'К'): nname += 'k' if (c == 'л') | (c == 'Л'): nname += 'l' if (c == 'м') | (c == 'М'): nname += 'm' if (c == 'н') | (c == 'Н'): nname += 'n' if (c == 'о') | (c == 'О'): nname += 'o' if (c == 'п') | (c == 'П'): nname += 'p' if (c == 'р') | (c == 'Р'): nname += 'r' if (c == 'с') | (c == 'С'): nname += 's' if (c == 'т') | (c == 'Т'): nname += 't' if (c == 'у') | (c == 'У'): nname += 'u' if (c == 'ф') | (c == 'Ф'): nname += 'f' if (c == 'х') | (c == 'Х'): nname += 'h' if (c == 'ц') | (c == 'Ц'): nname += 'ts' if (c == 'ч') | (c == 'Ч'): nname += 'tch' if (c == 'ш') | (c == 'Ш'): nname += 'sh' if (c == 'щ') | (c == 'Щ'): nname += 'sch' if (c == 'ъ') | (c == 'Ъ'): nname += '' if (c == 'ы') | (c == 'Ы'): nname += 'y' if (c == 'ь') | (c == 'Ь'): nname += "'" if (c == 'э') | (c == 'Э'): nname += 'e' if (c == 'ю') | (c == 'Ю'): nname += 'iu' if (c == 'я') | (c == 'Я'): nname += 'ia' if (c == ' ') | (c == '_'): nname += '_' if c == '\'': nname += '\'' if c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890()!@#$%^&-+=.': nname += c return nname
Таким образом, модуль rusconv содержит функцию преобразования основой которой является набор условий для букв русского алфавита (прописных и заглавных) и для некоторых символов: пробела, подчеркивания и опострофа. Обратите внимание, что опостроф записан как \' (бэк-слэш и опостроф). И особое внимание на последнее условие. Сначала предполагалось вместо этого условия написать else, в котором выполнялась бы строка nname += c. Но из за непредвиденных результатов (странные символы в результирующих именах, русские буквы через одну), лучшим решением оказалось сделать выполнение этой строки по строго заданному условие. То есть, если символ входит в эту строку (строку с буквами английского алфавита и символами, допустимыми в именах файлов), то оставлять этот символ без изменений. Такая схема работает безотказно! Возвращает функция ту же русскую строку, которую в нее передали, но в траслитерации.
После этого, подключаем наш модуль в основной скрипт.
import rusconv
А далее остается легкая часть. Организовывается ввод полного пути к каталогу с файлами, которые требуется переименовать, с помощью raw_input(). Получаем список файлов в этом каталоге с помощью os.listdir(). Устанавливаем этот каталог в качестве рабочего с помощью os.chdir(). В цикле обрабатываем полученный ранее список каталогов. А именно, получаем полное имя текущего файла путем объединения последовательности каталогов и имени файла.
fullname = os.path.join(fld, x)
Определяем, является ли текущий файл файлом (это может быть и каталог, так как os.listdir() выдает список имен всего, что есть в каталоге!).
if os.path.isfile(fullname):
Если же все-таки это файл, отсекаем от имени расширение.
f_ext = os.path.splitext(fullname)[1]
splitext() разбивает полное имя на две строки. В певой оказывается все кроме расширения, а вот во второй интересующее нас расширение файла с точкой (к примеру, '.txt'). Именно поэтому в квадратных скобках стоит индекс 1. Выделить и запомнить расширение текущего файла важно, так как транслитерацию для расширения делать не надо. Его позже следует приписать к новому имени файла в первозданном виде. Далее выделяем имя файла без расширения и прочих ненужных частей. Вероятно лучше его выделить с помощью разбияния по расширению, так как разбиение просо по точке крайне не надежно (имена могут быть с точками посередине!).
f_name = x.split(f_ext)[0]
Затем для получения нового имени передаем имя файла в функцию, описанную в модуле rusconv.
new_name = rusconv.convertChar(f_name)
И вызываем функцию переименования с использаванием нового имени и сохраненного ранее расширения.
os.rename(x, new_name + f_ext)
Вот собственно и все! Такой скрипт позволит сэкономить кучу времени и нервов. Примечание. Строка
# -*- coding: cp1251 -*-
в начале файла со скриптом указывает интерпретатору использовать кодировку cp1251, чтобы не возникало проблем с русскими буквами.