Переименует все файлы текущего каталога в транслит
Добавлено: 08 май 2025, 15:29
rename_files.sh
chmod +x 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