Multi-rename

http://tldp.org/LDP/abs/html/parameter-substitution.html#PCTPATREF (%, %%, # i ## operatori)

[quote]O “imaginarnim problemima” reći ću samo da u tom prvom kodu praviš istu grešku jer će sad on raditi samo za slučajeve kada imaš tačno dvije tačke između prefixa i ekstenzije. Nikako da uvidiš problemsku logiku a to je da:

  • prefix ne sadrži tačke
  • naziv epizode može sadržavati bilo šta
  • ekstenzija je fiksna[/quote]
    OK, napiši regex za:
    srt datoteka ima N tačaka: A.B.C.D.E.F.srt
    avi datoteka je nekada a) A.B.C.avi a nekada b) A.B.C.D.avi

I sa jednim i sa drugim pristupom posebno se trebaju obraditi a) i b);
Efektivno, ti se žališ da se moje rješenje za a) ne može iskoristiti za b). Ja nisam ni rekao da može bez prepravki, samo sam napravio korekciju da % radi matching sa desne strane (=> broj tačaka u srt je beznačajan, moramo se prilagoditi broju tačaka u avi datoteci)

Btw, vjerujem da postoji jedinstven regex koji rješava i a) i b); no ne želim to gledat na pun stomak.

Malo je forum nezgodan za ovakvih diskusija, više liči na igru gluhih telefona, sad kontam šta ti želiš reći, a nadam se i obrnuto.

P.S.
Borba do smrti Vedran <=> Adis sutra kode Reshe.

P.P.S.
ja volim ove tehničke “prepirke”, to ne znači da je posrijedi lični sukob (ili možda znači? posjetite! nas! na! redovnom! sastanku!, kod Reshe, četvrtkom u 20:00)

Ma naravno :slight_smile:
U lijevom uglu (stola kod reshe) Adis naoružan baš-čekićem, a u desnom uglu Vedran sa regeks-kobasicom. Ko će pobijediti? stay tuned!

Evo od mene za kraj “korektno” rješenje u Pythonu.
Datoteke:

1.a.b.avi 1.a.b.c.d.srt 2.a.b.avi 2.a.b.c.d.srt 3.a.avi 3.a.b.c.d.srt 4.avi 4.x.y.z.blablabla.srt
Kod:

[code]#!/usr/bin/env python

import os

srt = []
avi = []

for f in os.listdir("."):
if f.endswith(’.avi’):
avi.append(f)
if f.endswith(’.srt’):
srt.append(f)

for a in avi:
for s in srt:
if s.startswith(a[:-4]):
os.rename(a, s[:-4] + ‘.avi’)
srt.remove(s)
continue[/code]
Napravimo liste avi i srt datoteka, za svaku avi datoteku probamo naći srt datoteku sa istim početkom, ako nađemo preimenujemo avi datoteku i izbacimo srt sa liste. Mada mislim da je python jednostavniji nego ovaj opis “svojim riječima” :wink:

Pa jeste, Python rješenje je ekvivalentno ali duže :smiley: nekome je od svega ovoga lakše otvoriti file manager i promijeniti imena jedno po jedno…

Moj doprinos temi …

[code]#!/usr/bin/ruby

require ‘ftools’

Dir.glob(".avi").each { |iz|
u = Dir.glob("#{iz[0…-5]}
.srt").first[0…-5] + ".avi"
File.rename(iz,u)
}[/code]
Edit: zamijenio [0] sa .first da bude citljivije :slight_smile:

Hamo, šta mu dođe taj |iz| ?

Ja stavljam lovu na Vedrana (volim RegEx, Boze moj).
Btw. koja je kvota? :smiley:

to se koristi kod funkcija koje primaju blok koda kao parametar -
one u ono izmedju || stavljaju neku vrijednost
(unutar takve jedne funkcije pozoves funkciju “yield neka_vrijednost” i onda se blok pokrece po jednom sa svakom vrijednoscu za koju je yield pozvan) …
Moguce je staviti i vise vrijednosti u jednom pokretanju bloka …
Dakle each stavlja u |iz| po jedan elemenat niza i pokrece predani blok za svaki od njih …

Mada mislim da je python jednostavniji nego ovaj opis “svojim riječima” :wink:

Mogao si koristiti os.walk(); poprilicno simplificira stvari. Npr:

[code]import os

def myrename(dir, suff_old, suff_new):
for root, dirs, files in os.walk(dir):
if not len(dirs):
break
for f in files:
if f.endswith(“.txt”):
new_file = f[:-4] + suff_new
os.rename(dir + “/” + f, dir + “/” + new_file)

myrename(“.”, “.srt”, “.avi”)[/code]
…ili jos krace koristenjem glob modula (thanx hami :)):

[code]import os, glob

lst = glob.glob(“*.srt”)
for i in lst:
new = i[:-4] + “.avi”
os.rename(i, new)[/code]

ovaj kod dole ti ne radi kako treba … :wink:
Za domacu zadacu, skontaj sta ne valja :wink:

Sanele gdje koristiš stuff_old u myrename()? Nisam imao vremena probati, ali mislim da ne radi?! Nije riječ o pukom mijenjanju ekstenzija datoteka.

“Glob” rješenja mi se ne sviđaju, jer se može desiti da dobijamo matcheve za već preimenovane avi datoteke.
(u mom primjeru to izbjegavamo sa onim zadnjim ‘continue’)

Evo “skinuto” par linija, imal ko ideju kako izbjeći ove dvije ugnijezđene for petlje?

[code]import os

list = os.listdir(".");
srt = [f for f in list if f.endswith(’.srt’)]
avi = [f for f in list if f.endswith(’.avi’)]

for a in avi:
for s in srt:
if s.startswith(a[:-4]):
os.rename(a, s[:-4] + ‘.avi’)
srt.remove(s)
continue[/code]

ovaj kod dole ti ne radi kako treba
Ah… .avi to .srt, .srt to .avi… :stuck_out_tongue: :wink:

Sanele gdje koristiš stuff_old u myrename()? Nisam imao vremena probati, ali mislim da ne radi?! Nije riječ o pukom mijenjanju ekstenzija datoteka.
Pa gdje su te pythonske oci :P.

# if f.endswith(".txt"): if f.endswith(suff_old):

“Glob” rješenja mi se ne sviđaju, jer se može desiti da dobijamo matcheve za već preimenovane avi datoteke
Ne vidim zasto bi se ovo desavalo. Pythonov glob ucita kompletan sadrzaj direktorija u listu, pa tek onda tu listu vrati tako da je ovaj slucaj prakticno nemoguc (iskljucujem slucaj da tokom reimenovanja neki eksterni izvor zapocne novo reimenovanje).

Evo “skinuto” par linija, imal ko ideju kako izbjeći ove dvije ugnijezđene for petlje?
Valjda tako sto ih ne pisati uopste :P. Za ovakve stvari bi se mogao dict iskoristiti zbog one-to-one mapiranja; svaki fajl sa .srt ekstenzijom treba imati svog .avi ekvivalenta.

ne sanele … trebas raditi rename .avi to .avi ali da je ime isto kao kod .srt :slight_smile: pythonske oci ne citaju zadatak ? :slight_smile:

btw. adise ni ja ne vidim zasto bi glob radio matching vec promijenjenih datoteka … mozes li navesti slucaj u kojem se desava to o cemu govoris?

a.b.c.1.srt, a.b.c.2.srt i a.b.c.avi

Nisam baš 100% siguran, al ovaj avi odgovara uslovu “isti prefix” sa srt datotekama. Možda i samo izmišljam :smiley:

hm … sta treba raditi u tom slucaju nije navedeno u originalnom zadatku …

a moj program nece preimenovati vec preimenovanu datoteku nego ce
preimenovati a.b.c.avi u onu prvu koju “glob a.b.c*.srt” bude matchao - dakle najverovatnije u a.b.c.1.avi . poslije toga vise nece dirati tu datoteku …
prvi onaj glob uzima stanje kakvo je bilo originalno i ucita ga u listu i kasnije iako ti mijenjas imena - stanje u listi ostaje isto …

U sustini tvoj program s listama i moj su isti po funkcionalnosti samo za sta ti koristis sekvencijalno pretrazivanje (unutrasnja petlja) ja koristim jos jedan glob.

ne sanele … trebas raditi rename .avi to .avi ali da je ime isto kao kod .srt :slight_smile: pythonske oci ne citaju zadatak ? :slight_smile:
Crap! Totalno sam fulio bit… :stuck_out_tongue: