Átnevezési esettanulmány

Átnevezés
Átnevezés

Egy, viszonylag ritka témát dolgozunk most fel. A tömeges átnevezésre más hoztam pár példát, akár grafikus, akár pedig CLI megoldásokat. Egy "sima" átnevezés, ahol csak annyi a feladat, hogy egy karaktersort cseréljünk ki egy másikra nem túl nagy kihívás. Majdnem az összes grafikus fájlkezelő tudja ezt, illetve van pár jó fájl átnevező program is. Itt kiemelem, hogy nem minden fájl átnevező program alkalmas könyvtárak átnevezésre! Ennyi bevezetés után nézzük meg miről is lesz szó.

A feladat:

Adott egy komolyabb mennyiségű könyvtár, aminek a formátumára példa:

Magyar_népmese_-_A_boldog_család_-_Szemerédi_Bernadett  

ezt kellene átalakítani

Népek_meséi_-_A_boldog_család_-_magyar_népmese_(Szemerédi_Bernadett)

Első lépés

Ahogy kell, úgy indulunk. A feladatokat szétszedjük elemeire és hozzárendelünk egy-egy lépést.

  • A nemzetiség megnevezése nagy betűs, azt kis betűssé kell tenni.
  • Új első tagot kap: Népek_meséi
  • A sorrendet át kell helyezni
  • Az utolsó tag zárójelbe kerül

Mivel?

A kérdés nem is kérdés: tömeges műveletet érdemes CLI, azaz terminálban elvégezni. Illetve a biztonság kedvéért előbb egy könyvtáron, majd azután minden. Illetve én azt kedvelem, hogyha a munka fájlok stb. egy könyvtárban vannak, így a "minden végezd el ugyanazt a műveletet" kitétel egyszerűen megadható.

Azaz bemásoltam egy könyvtárba minden átalakítandó könyvtárat, és egy külön könyvtárba egyet tesztelésre.

Megoldás

Az első betűt kicsinyíteni kell. Erre majdnem minden átnevező alkalmas, így azt használd, amit kedvelsz. Én megszokásból a sed mellett döntöttem.

Alap a dolog, de azért nézzünk rá:

sed -e 's/^./\L&/' ./*

A mit akarunk átírni könnyű definiálni: az első karaktert. Erre nagyon jó a ^ jel, mert az az elejétől értelmezést ad a dolognak. Az azt követő pont egy karaktert jelent. A mire kérdést is könnyű meghatározni: legyen kisbetű. Ezt sokféleképp meg lehet adni, és most a látható egyszerű definíciót használtam. Ami itt fontos és alapvetően kényelmetlen: ezt a meghatározást nem minden program ismeri fel, így lehet, hogy másnál mást kell használni. a ./* alap meghatározás. A könyvtárban, ahol vagyunk mindent. Bár a joker karakter is elég, de jobb ha kifejezetten megadjuk, hogy az adott könyvtárban. kevesebb a hibalehetőség.

Itt kitérnék egy fontos - főleg nagyobb tételű átnevezésnél - dologra: ésszel gondoljuk át mit és hogyan teszünk. Ez egy jó példa, hiszen itt egyszerűen definiáltuk az első karaktert, de ha már Népek_meséi_-_A_boldog_család_-_magyar_népmese_(Szemerédi_Bernadett) formába átírjuk, akkor a harmadik tagban lévő első karaktert nem ennyire egyszerű megmondani. Lehet, de ha összetettebb a meghatározás. akkor bele lehet nagyon keveredni!

A következő lépés egy összevont lépés lesz, ahol a sorrendet és az elejére az új tagot egyszerre tesszük be. Itt két több van: rnm vagy rename, esetleg sed? Mi a rename és a sed hátránya? Két szuper program, mindegyik alkalmas mindenre, de nincs visszavonási lehetősége. Itt nem árt egy menekülőutat fenntartani, hiszen nagyon szépen el tudom barmolni a neveket. Így a rnm mellet döntöttem.

Ha ésszel nevezzük el a könyvtárt és a fájlokat, akkor könnyű a dolog. Ha nem, akkor szívás, de nagyon. mi itt a fő kérdés? Ha darabolni akarunk egy karakterláncot, itt a nevet, akkor jó, ha meg tudjuk adni a határokat egyértelműen.

Tipp: soha nem használj üres helyet, space karaktert a könyvtár és fájlnévben! Lehet, és kezeli is minden ezt a megoldást, de sokszor neked kell kezelni az üres helyet tartalmazó fájlneveket, hogy simán fel tudjuk dolgozni. Idézőjeleket kell kirakni ami macerás, ha egy ilyenre hivatkozol... Plusz kényelmetlenség az ilyen tömeges átnevezésnél, ha a fájlneveket fel kell darabolni. A feldaraboláshoz sokan az awk programot használják, mert az nagyon hatékony és jól meghatározható feltételeket ad. Én ezt most kerülném, hiszen ha valamit tud a fenti három program, akkor nem hívunk egy pluszt meg.

Itt a határoló a _-_ karaktersorozat.

Alapok: a sed és sok egyéb dolog átnevezéskor a /mit/mire/formátumot használja. Mindig kezdjünk azzal, hogy a /mit// tagot kitöltjük, de a lezáró pert is előre beírjuk. Majd a második tagot is kitöltjük. Bár sokaknak ez is egy zagyva karaktersor, amit használunk,de ez csak az alap. Ha regexperteket írogatunk be, akkor sok zárójel, per és visszaper és egyéb nem megszokott karakterekkel dolgozunk. Ha egy kimarad (nálam az utolsó per szokott), akkor a hibát megtalálni már nem olyan egyszerű.

A parancs pedig így néz ki:

rnm -rs '/(.*)_-_(.*)_-_(.*)/\2\1\3/' ./*

Legalábbis a darabolás és összefűzés. Azaz zárójelbe kerül az első tag, ami annyit ír le, .* egy karakter akármennyi alkalommal, addig, amíg nem jön egy _-_ ez legyen az első darab, az első tag. Majd a darabokat hasonlóképp tovább definiáljuk. Az a jó az rnm használatakor, hogy a tagokra sima "visszaper" és a tag eredeti sorszáma mód hivatkozunk. Másodikat kövesse az első, majd a harmadik tag gyorsan megadható. Ha így csinálod, lehet, hogy nem lesz jó. Mert a tagokat elválasztó karakterláncot _-_ nem rakja be automatikusan. Ezt nekem kell megadni. Ami logikus, hiszen senki nem határozta meg alapból az elválasztókat, és nem is elvárás ugyanazt használni. nekem nem volt ez ilyen egyértelmű, így nagyon szépen egybefolyt a könyvtárnév. A_boldog_családmagyar_népmeseSzemerédi_Bernadett, hát nem ezt akartam...

rnm -rs '/(.*)_-_(.*)_-_(.*)/\2_-_\1(\3/)' ./*

Így már a formátum jó. Ha valamelyik átnevező a () jeleket nem akarja kiírni így (Szemerédi_Bernadett), akkor egy menekülő karaktert kell elé tenni, azaz egy-egy plusz \ visszaper jelet... Nyugodtan játszadozhatunk, lépésről lépésre építhetjük fel a képletet, hiszen egy külön könyvtárba egy könyvtárnévvel dolgozunk, amit ha nagyon elrontunk, akkor sincs gond!

Már csak egy lépés kell, a vezető karakterláncot elé tenni, ami nem lesz probléma.

rnm -rs '/(.*)_-_(.*)_-_(.*)/Népek_meséi_-_\2_-_\1(\3/)' ./*

Ha a teszt könyvtárnév jó, akkor még egyszer megnézzük, hogy valóban jó és azután a parancs kiadható a munkakönyvtárban is. Az rnm előnye, hogy ez első árnevezés előtt rákérdez: ezt az egyet vagy mindegyiket, vagy egyiket sem... Plusz kedvesség a készítőtől az a megoldás amiben a válasz sorszámát kell megadni és nem elég az enter nyomogatása... Így nem lehet automatikusan nyomogatott enterrel elbaltázni az összes állományt!

Ha minden könyvtárnév egységes, nincs benne kivétel akkor már készen is vagyunk.

Tipp: érdemes a választható programok közt egyet kiválasztani. Más-más szintaktikát és más rexexpert nyelvet használnak, ami zavaró lehet.

Összefoglalva

Ha egységes elnevezésű fájlokat, mappákat használunk az átnevezésük, a nevek rendezése, megváltoztatása gyorsan megtehető. Erre sok program képes, ha szereted a parancssort, akkor a sed, a rename és az rnm teljesen alkalmas erre is.

Grafikus program? A grafikus programoknál én olyant nem találtam, aminél a regexpertezést meg lehetne úszni. Azaz egérrel kijelöljük az első tagot, majd azt mozgatjuk és hasonló megoldásokat nem sikerült felhajtani. A regexpertes megoldást sem mindegyik ismeri, de amelyik ismeri az sem feltétlen támogatja az áthelyezést. Én egyet ismerek - ha ismersz mást a linuxmint.hu-n oszd meg velem is - az pedig a DoubleCommander. Itt már komoly átnevező panelt kapunk, ahol az átcsoportosít is megadhatjuk.

Szuper!