Переименует все файлы текущего каталога в транслит

Ответить
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

Переименует все файлы текущего каталога в транслит

Сообщение ya »

rename_files.sh

Код: Выделить всё

#!/bin/bash

# Массив соответствий кириллических букв транслиту
declare -A translit_map=(
    [А]=A [Б]=B [В]=V [Г]=G [Д]=D [Е]=E [Ё]=Yo [Ж]=Zh [З]=Z [И]=I [Й]=Y [К]=K [Л]=L [М]=M [Н]=N [О]=O [П]=P [Р]=R [С]=S [Т]=T [У]=U [Ф]=F [Х]=X [Ц]=Ts [Ч]=Ch [Ш]=Sh [Щ]=Sch [Ъ]='' [Ы]=Y [Ь]='' [Э]=E [Ю]=Yu [Я]=Ya
    [а]=a [б]=b [в]=v [г]=g [д]=d [е]=e [ё]=yo [ж]=zh [з]=z [и]=i [й]=y [к]=k [л]=l [м]=m [н]=n [о]=o [п]=p [р]=r [с]=s [т]=t [у]=u [ф]=f [х]=x [ц]=ts [ч]=ch [ш]=sh [щ]=sch [ъ]='' [ы]=y [ь]='' [э]=e [ю]=yu [я]=ya
    [À]=A [Â]=A [Æ]=A [Ç]=S [É]=E [È]=E [Ê]=E [Æ]=E [Œ]=E [Î]=I [Ï]=I [Ô]=O [Œ]=O [Ù]=U [Û]=U [Ü]=U [Ÿ]=Y
    [à]=a [â]=a [æ]=a [ç]=s [é]=e [è]=e [ê]=e [æ]=e [œ]=e [î]=i [ï]=i [ô]=o [œ]=o [ù]=u [û]=u [ü]=u [ÿ]=y
    [í]=i [ú]=u [Ø]=0 [ñ]=n [№]=N [ã]=a
)

# Функция для транслитерации строки
transliterate() {
    local input="$1"
    local output=""
    local length=${#input}
    for (( i=0; i<length; i++ )); do
        char="${input:i:1}"
        if [[ ${translit_map[$char]} ]]; then
            output+="${translit_map[$char]}"
        else
            output+="$char"
        fi
    done
    echo "$output"
}

# Обработка каждого файла в текущем каталоге
for file in *; do
    # Проверяем, что это файл
    if [[ -f "$file" ]]; then
        # Получаем имя файла без расширения и расширение
        base_name="${file%.*}"
        extension="${file##*.}"
        # Если файл без расширения, extension будет таким же как base_name, исправляем это
        if [[ "$base_name" == "$file" ]]; then
            extension=""
        fi

        # Транслитерируем имя файла
        new_name=$(transliterate "$base_name")
        # Заменяем все пробелы и непонятные символы на нижнее подчеркивание
        new_name=$(echo "$new_name" | sed -E 's/[^a-zA-Z0-9.\-]+/_/g')
        # Удаляем начальные и конечные подчеркивания
        new_name=$(echo "$new_name" | sed -E 's/^_+|_+$//g')

        # Формируем новое имя файла
        if [[ -n "$extension" && "$extension" != "$base_name" ]]; then
            new_file="${new_name}.${extension}"
        else
            new_file="$new_name"
        fi

        # Проверяем, чтобы не перезаписать существующий файл
        if [[ "$file" != "$new_file" ]]; then
            # Если файл с новым именем уже существует, можно добавить суффикс или пропустить
            if [[ -e "$new_file" ]]; then
                echo "Файл $new_file уже существует, пропускаем переименование $file."
            else
                mv "$file" "$new_file"
                echo "Переименован: $file → $new_file"
            fi
        fi
    fi
done

exit 0
chmod +x rename_files.sh
Ответить