Недавно появилась необходимость массово переименовать большое количество файлов в транслит. После недолгих поисков нашел очень интересный bash-скрипт, выполняющий эту задачу.
Создаем новый файл translit.sh и задаем ему права доступа 755 (делаем его исполняемым). Копируем в него следующий код:
#!/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
Использование
Переходим в папку, в которой находятся файлы, которые нужно переименовать и коммандуем translit.sh. Скрипт рекурсивно пройдется по всем папкам в каталоге и переимеует их в транслит.
В таком виде не сработал. Следующие две строки
«$0»
cd ...
переделал в
«.../$0»
cd ...
Спасибо, замечательная вещь!
Помогло с учетом поправки «.../» — Благодарю!
Следующие две строки
«$0»
cd ...
без ошибок, надо лишь предварительно выполнить
su
mv [имя скрипта] /usr/local/bin/
exit
и запускать скрипт без префикса ./
Это позволит рекурсивно обойти все сабдиректории, а не только один уровень
буква Щ обрабатывается неверно, так как пропущена на 14 строчке
С заглавными косяк: например, «Юла» превращается в «JUla»