galaxyman 06.02.2010 20:53

СкриптыСкрипт для пакетного переименования (транслитерации) файлов

Скрипт для пакетного переименования (транслитерации) файлов и удаления пробелов в названии.
Назначение скрипта - переименовать рекурсивно все файлы, начиная с текущей папки, включая вложенные директории. При переименовании буквы русского алфавита заменяются по правилам транслитерации на английские, пробелы заменяются символом "_", "_-_" заменяются на "-". Правила конвертирования легко меняются правкой соответствующей строки скрипта.


Скрипт не мой, автор неизвестен. Я внес косметические изменения.

Пример работы скрипта.
Например есть файл:

Исполнитель - Имя композиции.mp3

После транслитерации и замены пробела сплэшем получаем:

Ispolnitel'-Imya_kompozicii.mp3

Скрипт работает рекурсивно, от текущей директории.
Файл скрипта можно скачать здесь.
Очень удобно для тех, кто часто работает в консоли. Например, я часто слушаю музыку с помощью mplayer, поэтому необходимость переключаться на русский и геморрой с пробелами мне быстро надоели. Скрипт очень выручает так же, если нужно выложить файлы на ftp или файлообменник (например на depositfiles.com русские буквы в именах файлов заменяются на символы подчеркивания, таким образом через некоторое время уже не знаешь, что это за файл).
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.

shopt -s nullglob
for NAME in *
do
TRS=`echo $NAME |tr : _`
TRS=${TRS//А/A};
TRS=${TRS//а/a};
TRS=${TRS//Б/B};
TRS=${TRS//б/b};
TRS=${TRS//в/v};
TRS=${TRS//В/V};
TRS=${TRS//г/g};
TRS=${TRS//Г/G};
TRS=${TRS//д/d};
TRS=${TRS//Д/D};
TRS=${TRS//е/e};
TRS=${TRS//ё/yo};
TRS=${TRS//Ё/Yo};
TRS=${TRS//ж/zh};
TRS=${TRS//Ж/Zh};
TRS=${TRS//з/z};
TRS=${TRS//З/Z};
TRS=${TRS//и/i};
TRS=${TRS//И/I};
TRS=${TRS//й/j};
TRS=${TRS//Й/J};
TRS=${TRS//к/k};
TRS=${TRS//К/K};
TRS=${TRS//л/l};
TRS=${TRS//Л/L};
TRS=${TRS//м/m};
TRS=${TRS//М/M};
TRS=${TRS//н/n};
TRS=${TRS//Н/N};
TRS=${TRS//о/o};
TRS=${TRS//О/O};
TRS=${TRS//п/p};
TRS=${TRS//П/P};
TRS=${TRS//р/r};
TRS=${TRS//Р/R};
TRS=${TRS//с/s};
TRS=${TRS//С/S};
TRS=${TRS//т/t};
TRS=${TRS//Т/T};
TRS=${TRS//у/u};
TRS=${TRS//У/U};
TRS=${TRS//ф/f};
TRS=${TRS//Ф/F};
TRS=${TRS//х/h};
TRS=${TRS//Х/H};
TRS=${TRS//ц/c};
TRS=${TRS//Ц/C};
TRS=${TRS//ч/ch};
TRS=${TRS//Ч/Ch};
TRS=${TRS//ш/sh};
TRS=${TRS//Ш/Sh};
TRS=${TRS//щ/sch};
TRS=${TRS//Щ/Sch};
TRS=${TRS//э/e};
TRS=${TRS//Э/E};
TRS=${TRS//ю/ju};
TRS=${TRS//Ю/Ju};
TRS=${TRS//я/ya};
TRS=${TRS//Я/Ya};
TRS=${TRS//ъ/\`};
TRS=${TRS//Ъ/\`};
TRS=${TRS//ь/'};
TRS=${TRS//Ь/'};
TRS=${TRS//ы/y};
TRS=${TRS//Ы/Y};
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



Тэги: script скрипт
+ 3 -
Похожие Поделиться

digiwhite 06.02.2010 21:21 #
Строчки TRS=${TRS//*/*} конечно порадовали :). Руками это жоско прописывать.
booley 06.02.2010 21:34 #
Хм, а в чем профит?
Мне удобнее хранить все названия на оригинальном языке, UTF-8 позволяет.

А переключаюсь на англ./рус. CapsLockом. Скорость едва ли ниже, а вот русские буквы греют душу :)

Насчет музыки, mplayer это жестоко... есть же mpd, moc, на крайний случай mpg321. Почему именно mplayer?

Относительно шаринга - я шарю файлы на домашнем сервере, он доступен повсюду. А нужные буквы кодируются urlencode/urldecode :)
HTaeD 07.02.2010 00:47 #
Зачем ставить mpg321, если можно mplayer /path/to/file.pm3 ?
albibek 07.02.2010 09:22 #
Чтобы не париться с пробелами, достаточно взять имя файла в одинарные кавычки или воспользоваться tab-completion.
Если я ничего не путаю, iconv должен был уметь делать такую транслитерацию. Если не умеет, проще всего создать для него кодировку, которую я бы тоже для начала поискал готовую.
galaxyman 07.02.2010 10:23 #
iconv должен был уметь делать такую транслитерацию
и рекурсивно спускаться по каталогам?
galaxyman 07.02.2010 10:25 #
или воспользоваться tab-completion
вот автодополнению и мешают часто пробелы, если имена файлов или каталогов начинаются одинаково
albibek 07.02.2010 09:23 #
И ещё, кстати:
if << `file -b "$NAME"` == directory >>;
легко заменяется на
if << -d "$NAME" >>;
Почитайте man test - будет интересно :)
albibek 07.02.2010 09:25 #
Виноват, скобки одинарные:
if < -d "$NAME" >>;

(Как же не зватает правки комментариев :()
albibek 07.02.2010 09:26 #
Блин :(
Третья правка. Объедините в один, если можно :).
if < -d "$NAME" >;
digiwhite 07.02.2010 11:02 #
Скобки таки двойные.
booley 07.02.2010 20:29 #
КАК ЖЕ УЖАСНО ПИСАТЬ МАЛЕНЬКИМИ БУКВАМИ!
s47 22.02.2010 00:48 #
Хотел бы задать вопрос оффтопиком, т.к. на отдельный пост ради него не решился.
Скрипты писать не умею, абсолютно не знаком с грамматикой/синтаксиксом. А данная тема, частично касается моего вопроса.
Ситуация следующая: есть в папке с подпапками какое-то количество файлов содержащих необходимую к замене строчку. Как эту строчку заменить на нужную, не прибегая к ручному редактированию каждого файла, не говоря уже про поиск этих самых файлов.
То что нашёл это вот это. Но, как я понял, здесь есть подкавырка с SVN.
Также комманда Find должна помочь. Примерно вот как тут Но я не очень понял как этот "этаж" сложить в комманду. На сколько я понял, его нужно внутрь скрипта запихнуть.
В общем просьба наставить на путь истинный.
Darion 27.05.2010 13:00 #
Чтоещезадепозитфайлс? о.О
http://pastebin.com/Fp0dXv86
cppmm 27.05.2010 14:52 #
Исполнитель - Имя композиции.mp3

После транслитерации и замены пробела сплэшем получаем:

Ispolnitel'-Imya_kompozicii.mp3

Первый вариант лучше. Апостроф - это служебный символ, рискуем нарвать на глюки.
cppmm 27.05.2010 14:52 #
*нарваться