Teme: programiranje | Računari

BAT skript za brzi bekap

Skraćena veza: http://pedja.supurovic.net/veza/5259

Pravljenje rezervnih kopija koda na kome radim mi je uvek pravilo glavobolju. Ma koliko da je to neophodno, redovno mi se dešava da napravim kopiju u nekom bitnom momentu.

Nakon poslednje komplikacije koju sam imao zato što nisam imao odgovarajuću kopiju, odlučio sam da se tim pitanjem malo ozbiljnije pozabavim. Probao sam nekoliko programa za tu namenu, i uglavnom zaključio da to meni ne radi posao.

Glavni problem je što treba da se setim da pokrenem postupak kopiranja, a zatim i da to zaista i učinim, pokretanjem odgovarajućeg programa.

Pošto, doduše malo neobično za današnje vreme, najviše vremena i dalje radim u komandnom prozoru (da, na Windows-u) , čak i kada radim na veb projektima, smislio sam prilično brzo i efikasno rešenje. Napravio sam backup.bat datoteku koja će mi sama kopirati sve što je potrebno. To se pokazalo i najefikasije, jer mije procedura za kopiranja uvek pri ruci pa je zaista često i obavljam (čak sam počeo i da preterujem u tome, ako je uopšte moguće preterati).

Prilikom pravljenja bat datoteke pojavio se samo jedan problem: kako svaku kopiju snimiti u zaseban direktorijum, da bi se sačuvale i prethodne kopije. Pošto je bat programski jezik ograničen, nisam baš lako našao rešenje.

Osnovna ideja je da se ime direktorijuma sačini na osnivu trenutnog datuma i vrmena, ali se pokazalo da je to popriličan zalogaj, jer bat ne ume baš dobro da radi sa datumskim podacima, a naročito probleme je što datum i vreme koje bat datoteke vidi zavise od formatiranja koje je podešeno na računaru.

Na Interetu sam nalazio razne pokušaje da se ovaj problem prevaziđe, ali niko nije uspeo da u potpunosti savlada sve načine formatiranja datuma i vremena koje je moguće podesiti.

Ali ja ne bih bio ja da ne rešim nerešivo. Ha!

U stvari je rešenje prosto kada se utvrde stvarne potrebe. Naime, svi su išli logikom da treba isparsirati pojedinačne podatke: godinu, mesec, dan, sat, minut, sekund… pa onda te pojedinačne podatke sastaviti u odgovarajući naziv za direktorijum ili datoteku. Parsiranje je problematično, jer umnogome zavisi od formata prikaza datuma i vremena.

No, meni je, u stvari, najvažnije bilo samo to da dobijem jedinstveno ime direktorijuma, a to da li će iz njega biti čitki datum i vreme, je nevažno. Tako sam došao na ideju da u stvari ne parsiram podatke, nego samo da iz njih izbacim one znakove koji su nedozvoljeni u imenu datoteke. Tako očišćeni, mogu se bez problema primeniti.

I evo datoteke backup.bat koja radi bekap:

SET _date=%date%-%time%
SET _tmp=%_date:.=%
SET _tmp=%_tmp::=%
SET _tmp=%_tmp:/=%
SET _date=%_tmp%

XCOPY *.* "x:\mojprojekat-%_date%\" /y /f /r /s

Kada podešavam ovu datoteku da pravi rezervne kopije za neki drugi projekat samo izmenim u parametrima komande XCOPY deo koji označava putanju gde treba da se kopija snima. U ovom primeru to je x:\mojprojekat.

Ovo nije neko fensi rešenje, i prilično je primitivno, ali meni bolje ne treba, a vremenom se pokazalo kao prilično efikasno i korisno.  Možda još nekome bude pomoglo.

Ima li šta bolje?

Naravno da ima bolje. Od raznih mogućih kompletnih rešenja za čuvanje kopija preporučujem upotrebu servera sorsa, i to najpre SVN Server. Zahteva malo više podešavanja da se stvar postavi na noge, ali kada to jednom namestite bićete oduševljeni koliko je to praktična i funkcionalna stvar.

Kada uhvatim vremena, o tome ću posebno pisati. Zato, proveravajte moj blog s vremena na vreme.


Podelite ovaj članak sa prijateljima


11 comments to BAT skript za brzi bekap

  • Danilo

    Svatam da malo promašujem temu, ali prosto moram.. 🙂 Ovo jeste BRZO rešenje. Versioning sistemi su PRAVO rešenje. Kada se savlada početak (koji nije nimalo težak), prosto nema nazad – ne zato što nije moguć, nego zato što nikome ko je probao neće pasti na pamet. 🙂

    U poslednje vreme dosta koristim Git i daleko je jednostavniji od Subversion-a (SVN) za lokalni/single developer razvoj jer ne zahteva server, njegov setup, niti komunikaciju sa istim (to je svakako moguće ako ima potrebe) već se ceo repozitorijum čuva na lokalnoj mašini.

    Mada, nisam siguran kako Git funkcioniše u Windows okruženju. U Linuxu se koristi kao skup alata iz komandne linije, a postoje i neka grafička okruženja. Ono što je sigurno je da popularnija razvojna okruženja (IDE) već imaju ili postepeno dobijaju podršku za Git.

  • Lajna

    Za neke fajlove/foldere koristim Dropbox. Tako dobijam i sinronizaciju tih fajlova izmedju vise racunara.
    Basic plan je free, i 2GB prostora je slobodno za koriscenje.
    pozz

  • Ako moja 2 eurocenta pomažu, za izvorni kod je najbolje koristiti neki od modernih sistema za upravljanje verzijama — git ili merkurijal (Mercurial, hg). Git radi pod vindovsom, ali malo neočekivano tako da je merkurijal verovatno bolje rešenje.

    SVN ne valja koristiti zato što ima fatalne mane, poput nevođenja računa o istorijatu stapanja (merge). Da se razumemo, dok nije postojalo ništa bolje, SVN je bio u redu, ali danas su dostupni bolji alati (videti pod: git), pa treba koristiti njih. Detalji: http://www.youtube.com/watch?v=4XpnKHJAok8

    • holodoc

      SVN vodi računa o istoriji stapanja (merge) samo na malo drugačiji način od ostalih sistema za verzionisanje. Za pregled kompletne istorije grane (branch) uključujući i istoriju stapanja dovoljno je navesti parametar „–use-merge-history“ parametar (kraća verzija „-g“) tokom pregleda SVN loga te grane.

      • Dobra stvar života u modernim vremenima je da danas postoje dobri alati koji premošćuju između različitih sistema za verzije.

        Dovoljno sam komotan sa gitom da ga koristim isključivo u radu, a ako treba da šaljem kod u skladišta koja nisu git, koristim most git->štagod (od njih, git->svn je posebno dobro urađen!), tako da što se mene tiče svako u timu može da izabere alat koji mu najviše odogovara.

        Doduše, lično ne razumem fiksaciju na svn, ali to nerazumevanje je srećom samo moj problem. 🙂

  • holodoc

    Iz mog ličnog iskustva najbolja varijanta za skladištenje projekata jeste kombinacija sistema za verzionisanje i posebnog servera (računara) koji se nalazi u istoj mreži kao i razvojna mašina.

    U kućnim uslovima dovoljno je imati jedan zaseban računar u mreži na kome je instaliran neki enteprise-level distro tipa CentOS sa svim neophodnim serverima tipa svnserve, Apache, MySQL itd. Prednost ovakvog pristupa je što se backupovani podaci, posebno oni kroz SVN, skladište na zasebnoj mašini i potpuno su nezavisni od računara na kojima se projekti razvijaju.

    U slučaju da ne postoji mogućnost za uvođenje dodatne zasebne mašine VirtualBox je odlična zamena.

    Što se tiče rasprave oko sistema za verzionisanje tu zaista ne postoje čvrsta pravila i svako će hvaliti svog konja. Ja lično preferiram SVN nad ostalim sistemima iz jednostavnog razloga što je dovoljno dobar za razvoj u malim grupama i što se bolje snalazi sa binarnim podacima prilikom commit-ova. Takođe SVN je i dalje daleko bolje podržan u razvojnim okruženjima i specijalnim namenskim aplikacijama koje se koriste za organizaciju projekta (tipa activeCollab i sl.)

    • +1 za poseban računar.

      Moja 2 centa u vezi sa ostatkom setapa:
      – za ovakve stvari ne verujem virtualboksu. Ne želim da se nađem u situaciji da se nešto pokvari i da onda ne mogu da izbavim podatke iz diska virtuelne mašine. Fizička mašina i fizički diskovi su ipak prava stvar, dati par stotina € za to nije mnogo.

      – takođe, biram da svi razvojni računari imaju instaliran *isti* OS ako je moguće, čak i po cenu da serveri za odlaganje podataka vrte nešto što nije nužno okarakterisano kao serverska distribucija/os.

  • Sokobanja

    U potpunosti se slazem sa filmil-om. Mislim da ono sto se nekad cini kao jeftinije resenje, moze na kraju biti skuplje. Zato nikad nije skupo platiti nesto od cega zavisimo

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Popunite izraz tako da bude tačan: *