Skip to content

Instantly share code, notes, and snippets.

@a-vasyliev
Last active July 11, 2023 08:58
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save a-vasyliev/009cb30a7bd99a61d1bb to your computer and use it in GitHub Desktop.
Save a-vasyliev/009cb30a7bd99a61d1bb to your computer and use it in GitHub Desktop.
#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.
#
# Источник: http://www.ubuntu.sumy.ua/2011/03/translit.html
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
@duzun
Copy link

duzun commented Jan 31, 2018

Улучшенная версия :)

  • Не вызывает bash рекурсивно - быстрее работает
  • Убирает диакритические знаки
  • Меняет пробелы на _
#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.
#
# Improved by Dumitru Uzun (https://DUzun.Me)
#
# Источник: http://www.ubuntu.sumy.ua/2011/03/translit.html

shopt -s nullglob

# translit "стринг"
# echo "текст" | translit
# translit <<< "стдин"
translit() {
    local NAME=${*:-$(cat)};
    local TRS;
    TRS=$(sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/" <<< "$NAME")
    TRS=$(sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/" <<< "$TRS")
    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//Ь/\'}
    hash iconv &> /dev/null && TRS=$(iconv -c -f UTF8 -t ASCII//TRANSLIT <<< "$TRS")
    echo "$TRS";
}

trans_mv() {
    local dir=${1:-$PWD}
    for NAME in "$dir"/* ; do
        TRS=$(translit <<< "${NAME// /_}")
        if [ "$NAME" != "$TRS" ]; then
            # echo "\"$NAME\" -> \"$TRS\""
            mv -v "$NAME" "$TRS"
        fi
        if [ -d "$TRS" ]; then
            trans_mv "$TRS"
        fi
    done

}

trans_mv "$1"

P.S. Я украл этот код для своего проекта duzun/dotfiles ;)

@sergeevabc
Copy link

sergeevabc commented May 23, 2020

Под Windows имеем 'shopt' is not recognized as an internal or external command, operable program or batch file.
А вот этот вариант работает, правда, без буквы «ы».

@artemsites
Copy link

artemsites commented Nov 16, 2021

duzun спасибо работает на linux!
нужно создать файл какой нибудь cyr2lat.sh и разрешить его выполнять
после запуска этого файла мои изображения в папке и подпапке переименовались в латинские символы
только я под себя немного изменил идентификацию символов

#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.
#
# Improved by Dumitru Uzun (https://DUzun.Me)
#
# Источник: http://www.ubuntu.sumy.ua/2011/03/translit.html
#
# Источник: https://gist.github.com/a-vasyliev/009cb30a7bd99a61d1bb
#
# Артём Кузнецов (я) немного изменил его под себя

shopt -s nullglob
# translit "стринг"
# echo "текст" | translit
# translit <<< "стдин"
translit() {
    local NAME=${*:-$(cat)};
    local TRS;
    TRS=$(sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/" <<< "$NAME")
    TRS=$(sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/" <<< "$TRS")
    TRS=${TRS//ч/ch} TRS=${TRS//Ч/Ch};
    TRS=${TRS//ш/sh} TRS=${TRS//Ш/Sh};
    TRS=${TRS//ё/jo} TRS=${TRS//Ё/Jo};
    TRS=${TRS//ж/g} TRS=${TRS//Ж/G};
    TRS=${TRS//щ/sch} TRS=${TRS//Щ/Sch};
    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//Ь/};
    TRS=${TRS//,/-};
    hash iconv &> /dev/null && TRS=$(iconv -c -f UTF8 -t ASCII//TRANSLIT <<< "$TRS")
    echo "$TRS";
}

trans_mv() {
    local dir=${1:-$PWD}
    for NAME in "$dir"/* ; do
        TRS=$(translit <<< "${NAME// /-}")
        if [ "$NAME" != "$TRS" ]; then
            # echo "\"$NAME\" -> \"$TRS\""
            mv -v "$NAME" "$TRS"
        fi
        if [ -d "$TRS" ]; then
            trans_mv "$TRS"
        fi
    done

}

trans_mv "$1"

@bolshukhin
Copy link

Hello. And is it works with sub folders for translit?

Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment