суббота, июля 25, 2009

Mass rename в bash

Часто приходится переименовывать кучу файлов по шаблону. Не помню как это делалось в видне, в линуксе для этого есть несколько программ и скриптов, аля mmv. Но мне в них то не хватает возможности, то еще что-нибудь не так. А самое главное их надо отдельно ставить. В общем наловчился делать все стандартными средствами.
Пример:
Имеем первый сезон Декстера:
$ ls -1
Dexter - 101 - Dexter.avi
Dexter - 102 - Crocodile.avi
Dexter - 103 - Popping Cherry.avi
Dexter - 104 - Lets Give the Boy a Hand.avi
Dexter - 105 - Love American Style.avi
Dexter - 106 - Return to Sender.avi
Dexter - 107 - Circle of Friends.avi
Dexter - 108 - Shrink Wrap.avi
Dexter - 109 - Father Knows Best.avi
Dexter - 110 - Seeing Red.avi
Dexter - 111 - Truth Be Told.avi
Dexter - 112 - Born Free.avi

Хотим убрать все, кроме номера эпизода.

Говорим:
for i in Dexter*; do mv "$i" $(echo $i | sed 's/.*\([0-9]\{3\}\).*/\1.avi/'); done

И получаем то, что хотели:
ls *.avi -1
101.avi
102.avi
103.avi
104.avi
105.avi
106.avi
107.avi
108.avi
109.avi
110.avi
111.avi
112.avi

Это стандартный цикл, в котором файлы переименовываются в провернутые через sed свои имена. Круглые и фигурные скобки приходится фильтровать для bash.