Rose debug info
---------------

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

Иногда нужно переименовать кучу файлов из кириллицы в транслит
Любимая_песня_мамы.mp3 —> Lubimaja_pesnia_mami.mp3
В контексте работы с архивом именование файлов латиницей очень важно по нескольким причинам.

Простой пример: в некоторых случаях файл при публикации в интернете Любимая_песня_мамы.mp3 может преобразовываться вот в такое:
%D0%9B%D1%8E%D0%B1%D0%B8%D0%BC%D0%B0%D1%8F_%D0%BF%D0%B5%D1%81%D0%BD%D1%8F_%D0%BC%D0%B0%D0%BC%D1%8B.mp3
Это не удобно потому, что это нечитаемо, длинна названия увеличивается в три раза.
Имея опыт работы с разными собирателями могу утверждать, что файлы называют и подлиннее, умещая туда как минимум паспорт записи. Это тоже в некоторых случаях вызывает проблемы. Например при копировании на старых версиях Windows. Во всем виноваты устаревшие файловые системы и протоколы. Так же проблема с кириллицей может возникнуть в случае если ваш жесткий диск перестал работать и из него необходимо вытащить специальными программами информацию. Разработчики таких программ мало заботятся о странах не использующих латиницу. Восстановить имена файлов может и не получиться.

Конвертация

Когда файлов три или пять, это не беда, но если у вас их полторы тысячи и все он лежат в разных папках, то тут нужен скрипт. Я нашел такой в интернете, к сожалению не помню где, но если найду автора, то оставлю ссылку конечно.
Скрипт работает только в linux и других *nix системах (напрмер в MacOS)
Копируем текст в файл rename.sh
Даем права файлу на выполнение chmod u+x
Скрипт переименовывает все подряд в том каталоге в котором находится.
Запуск ./rename.sh

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

# shopt встроенная команда оболочки. Управляет опциями оболочки.
# Если в каталоге нет ни одного файла, соответствующего шаблону,
# то за имя файла принимается сам шаблон.
# Ключ nullglob исправляет эту ситуацию
shopt -s nullglob
# Перебираем все файлы в текущем каталоге
for NAME in * ; do
# sed-ом заменяем символы кирилицы на символы латиницы
 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//Ь/\'}
 TRS=${TRS// /_}
 # переименовываем
 mv -v "$NAME" "$TRS"
# Если это каталог, заходим в него
 if [[ `file -b "$TRS"` == directory ]]; then
 cd "$TRS"
 "$0"
 cd ..
 fi
done
Поделиться
Отправить
 503   2021   linux   архив