13.02.2011 | 02:32
Stvar sam, na kraju rijesio, tako da sam odradio sezonu po sezonu tako da mi nisu trebali wildcards ali me, svejedno zanima, sto mogu koristiti kod takvih vrsta querya...
Imao si prilično ambiciozan plan za Automator.
Uz pretpostavku da tvoji xevi (xxxxxx 102 xxxxx.avi) mogu biti bilo koji karakter (pa tako jedan od filenejmova može biti "ljeto 102 bicikl4.avi" ), problem je u tome što se taj batch renamer mora pobrinuti da uredno razlomi ime u tri dijela: prvi dio (do 102) pa onda središnji (102) kojeg želiš zamijeniti s novim (S1 E02) i nakon toga ostatak (sve iza 102).
Ne pada mi na pamet kako to izvesti koristeći Automatorovu "laku artiljeriju". A teška artiljerija se svodi na pokretanje shell skripte iz Automatora, ali onda Automator postaje suvišan jer se to može riješiti u jednoj jedinoj (ali ne postebno user-frienly) liniji u terminalu.
ls * | awk '{print("mv \\""$0"\\" \\""$0"\\"")}' | sed 's/\\([a-zA-Z0-9]*\\) 102 \\([a-zA-Z0-9]*\\)/\\1 S1 E01 \\2/2' | /bin/sh
Za testirati ovo gore, napravi jedan folder i pobacaj u njega fajlove koji se zovu, recimo:
a 102 b.avi
c 102 d.avi
bilo 102 sto.avi
U terminalu dođi u taj folder (sa "cd" ), kopipejstaj gornji kod i pritisni enter. Kad se izvrši, fajlovi će se zvati:
a S1 E02 b.avi
c S1 E02 d.avi
bilo S1 E02 sto.avi
A sad malo seciranja "kobasice".
Ovo lista SVE fajlove u folderu u kojem se nalazimo. Koristimo pipe (|) za proslijediti rezultate listanja sljedećoj naredbi koja će ih iskoristiti.
awk '{print("mv \\""$0"\\" \\""$0"\\"")}'
Awk je cijeli jedan programski jezik koji u ovom slučaju koristimo za generirati mv komandu sa željenim argumentima. Primjerice, kad ls izlista ime fajla "a 102 b.avi", ovaj gore awk će za to ime generirati ovo:
mv "a 102 b.avi" "a 102 b.avi"
I čini se "uzaludno" jer preimenuje fajl "a 102 b.avi" u fajl istog imena (dakle, ne radi ništa). Istina, ne radi ništa - za sad.
Awk svoj rezultat (to je ovaj "mv..." gore) proslijedi sedu. Sed je stream editor i odradit će najteži dio zadatka - razlomiti ime i presložiti ga u novo.
sed 's/\\([a-zA-Z0-9]*\\) 102 \\([a-zA-Z0-9]*\\)/\\1 S1 E01 \\2/2'
U konkretnom slučaju, napravit će to ovako: traži bilo koji karakter DO oznake " 102 " (razmak pa 102 pa razmak). I to će spremiti kao svoj prvi rezultat. Potom traži bilo koji karakter prema kraju i sprema ga kao drugi rezultat. Nakon toga mijenja pronađeno s imenom u formatu: "prvi rezultat" pa "S1 E01" pa drugi rezultat. Ali (primjeti zadnju dvojku!) ne radi to prvom imenu unutar "mv..." naredbe već drugom. Tako dobijemo ovo:
mv "a 102 b.avi" "a S1 E01 b.avi"
Što napokon ima smisla jer to i želimo - naredbu (mv) koja će "a 102 b.avi" preimenovati u "a S1 E01 b.avi".
Nakon što smo je kreirali, pajpamo (|) rezultat shellu (/bin/sh) koji ga izvrši (obavi rename).
I to se ponovi za onoliko fajlova koliko ih ls izlista.
U "kobasici" možeš "102" i "S1 E01" zamijeniti sa drugim "oznakama" pa postaje univerzalno upotrebljiva dok god su fajlovi imenovani u formatu kojeg si naveo.