Пакетное переименование кириллических имен файлов в латинницу (translit)

Недавно у меня возникла потребность переименовать целую группу файлов из кириллицы в транслит (для чтения на моём не русифицированном Palm ), и после недолгого поиска я нашел один интересный скрипт, для которого ниже даю рекомендации по использованию.


1)  создадим файл с именем translit.sh в каталоге /usr/bin/. В принципе, имя может быть любым, но будьте внимательны, чтобы оно не совпало с уже используемым в системе. Для этого выполним:

sudo gedit /usr/bin/translit.sh

2) в появившимся окне текстового редактора вставим нижеследующий код:

#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.

shopt -s nullglob
for NAME in * ; do
TRS=`echo $NAME | sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/"`
TRS=`echo $TRS | sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/"`
TRS=${TRS//ч/ch};
TRS=${TRS//Ч/CH} TRS=${TRS//ш/sh};
TRS=${TRS//Ш/SH} TRS=${TRS//ё/jo};
TRS=${TRS//Ё/JO} TRS=${TRS//ж/zh};
TRS=${TRS//Ж/ZH} TRS=${TRS//щ/sh\'};
TRS=${TRS///SH\'} TRS=${TRS//э/je};
TRS=${TRS//Э/JE} TRS=${TRS//ю/ju};
TRS=${TRS//Ю/JU} TRS=${TRS//я/ja};
TRS=${TRS//Я/JA} TRS=${TRS//ъ/\`};
TRS=${TRS//ъ\`} TRS=${TRS//ь/\'};
TRS=${TRS//Ь/\'}
if [[ `file -b "$NAME"` == directory ]]; then
mv -v "$NAME" "$TRS"
cd "$TRS"
"$0"
cd ..
else
mv -v "$NAME" "$TRS"
fi
done

3) закроем редактор, применив изменения
4) установим исполняемые права для файла:

sudo chmod 775 /usr/bin/translit.sh

 Теперь, для того, чтобы переименовать все файлы и каталоги внутри какого-то каталога, нам необходимо лишь перейти в него и выполнить команду translit.sh
Пример использования: 

/media/m/Books/Художественное/Semenova/FB2$ translit.sh
«Семенова Мария» -> «Semenova Marija»
«Валькирия.fb2» -> «Val’kirija.fb2»
«Ведун.fb2» -> «Vedun.fb2»
«Викинги.fb2» -> «Vikingi.fb2»
«Волкодав» -> «Volkodav»
«1. Волкодав.fb2» -> «1. Volkodav.fb2»
«2. Право на поединок.fb2» -> «2. Pravo na poedinok.fb2»
«3. Истовик-камень.fb2» -> «3. Istovik-kamen’.fb2»
«4. Знамение пути.fb2» -> «4. Znamenie puti.fb2»
«5. Самоцветные горы.fb2» -> «5. Samocvetnye gory.fb2»
«Два короля.fb2» -> «Dva korolja.fb2»
«Кудеяр» -> «Kudejar»
«1. Аленький цветочек.fb2» -> «1. Alen’kij cvetochek.fb2»
«2. Вавилонская башня.fb2» -> «2. Vavilonskaja bashnja.fb2»
«Лебединая дорога.fb2» -> «Lebedinaja doroga.fb2»
«Лебеди улетают.fb2» -> «Lebedi uletajut.fb2»
«Меч мертвых.fb2» -> «Mech mertvyx.fb2»
«Мир Волкодава» -> «Mir Volkodava»
«1. Бусый волк.fb2» -> «1. Busyj volk.fb2»
«2. Там, где лес не растет.fb2» -> «2. Tam, gde les ne rastet.fb2»
«Орлиная круча.fb2» -> «Orlinaja krucha.fb2»
«Пелко и волки.fb2» -> «Pelko i volki.fb2»
«Поединок со змеем.fb2» -> «Poedinok so zmeem.fb2»
«Родная душа. Рассказы о собаках.fb2» -> «Rodnaja dusha. Rasskazy o sobakax.fb2»
«С викингами на Свальбард.fb2» -> «S vikingami na Sval’bard.fb2»
«Те же и скунс» -> «Te zhe i skuns»
«1. Те же и скунс.fb2» -> «1. Te zhe i skuns.fb2»
«2. Те же и скунс — 2.fb2» -> «2. Te zhe i skuns — 2.fb2»
«Хромой кузнец.fb2» -> «Xromoj kuznec.fb2»
«Эгида» -> «JEgida»
«1. Вкус крови.fb2» -> «1. Vkus krovi.fb2»
«2. Заказ.fb2» -> «2. Zakaz.fb2»
«3. Магия успеха.fb2» -> «3. Magija uspexa.fb2»
«4. Преступление без срока давности.fb2» -> «4. Prestuplenie bez sroka davnosti.fb2»
«5. Экстрасенс.fb2» -> «5. JEkstrasens.fb2»
«Год Людоеда.fb2» -> «God Ljudoeda.fb2»
«Дядя Леша.fb2» -> «Djadja Lesha.fb2»

3 комментария Пакетное переименование кириллических имен файлов в латинницу (translit)

  1. Evg:

    evg@geminga:~/Музыка/Владимир Высоцкий/Visotskii_best$ sh ~/ttt.sh
    /home/evg/ttt.sh: 5: shopt: not found
    /home/evg/ttt.sh: 28: Bad substitution

  2. Evg, shopt это команда bash. Возможно, именно sh мог выдать ошибку. Такое бывает.
    Попробуйте выполнить просто как ~/ttt.sh , установив предварительно исполняемые права файлу, как указано выше.

  3. moe:

    Скрипт местами кривой и не по госту

    Улучшенный вариатн

    #!/bin/bash
    # Перекодирует рекурсивно в текущем каталоге имена
    # файлов и каталогов в транслит.

    shopt -s nullglob
    for NAME in * ; do
    TRS=`echo $NAME | sed «y/абвгдезийклмнопрстуфхц/abvgdezijklmnoprstufxc/»`
    TRS=`echo $TRS | sed «y/АБВГДЕЗИЙКЛМНОПРСТУФХЦ/ABVGDEZIJKLMNOPRSTUFXC/»`
    TRS=${TRS//ч/ch} TRS=${TRS//Ч/CH};
    TRS=${TRS//ш/sh} TRS=${TRS//Ш/SH};
    TRS=${TRS//ё/jo} TRS=${TRS//Ё/JO};
    TRS=${TRS//ж/zh} TRS=${TRS//Ж/ZH};
    TRS=${TRS//щ/shh} TRS=${TRS//Щ/SHH};
    TRS=${TRS//э/e\`} TRS=${TRS//Э/E\`};
    TRS=${TRS//ю/ju} TRS=${TRS//Ю/JU};
    TRS=${TRS//я/ja} TRS=${TRS//Я/JA};
    TRS=${TRS//ъ/\`\`} TRS=${TRS//Ъ/\`\`};
    TRS=${TRS//ь/\`} TRS=${TRS//Ь/\`};
    TRS=${TRS//ы/y\’} TRS=${TRS//Ы/Y\’};

    if [[ `file -b «$NAME»` == directory ]]; then
    mv -v «$NAME» «$TRS»
    cd «$TRS»
    «$0»
    cd ..
    else
    mv -v «$NAME» «$TRS»
    fi
    done

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *