( uid_21365 | 2021. 01. 02., szo – 22:41 )

Most hogy angolul tanulok, töltögetek le egy rakás angol filmet... jobbára természetfilmet, mert azt valahogy jobban megértem. A filmek egy belső SSD egységre mennek, ami 2 TB nagyságú, de mert ugye illik biztonsági másolatot készíteni, időnként archiválom is őket 2 külső merevlemezre, amik egyenként 3 terabájtosak. (Tehát két külön biztonsági másolatot is készítek).

Ezt a mentést az utóbbi időkben elhanyagoltam, sok mentenivaló gyűlt össze. Tegnap nekifogtam, és hát úgy találtam bizony rém macerás a rengeteg tartalomjegyzéket nekem személyesen ellenőrizni a merevlemezeken, melyik fájl nincs még oda átmásolva az SSD egységről...

Gondoltam, biztos van erre valami tool már, ami szinkronizálja a két tartalomjegyzék-struktúrát, de bevallom lusta voltam rákeresni, mert ugye aztán azt telepítenem kéne, ki tudja milyen függőségei vannak, meg kéne tanulni a kezelését is, tuti tele van egy rakás olyan feature-val is ami nekem nem kéne...

Szóval végigcsináltam inkább az egészet kézzel. manuálisan. Hát jó nagy szopás volt.

És egyre az járt a fejemben hogy ez azért mégis szégyen! Oké, most megcsináltam, de legközelebb is meg azután is?!

Végül persze azt a megoldást választottam amit biztos minden kedves Olvasóm kitalált eddigre: Írtam egy saját programot e feladatra, természetesen Peri nyelven! Íme a psync program:

###sysinclude standard.uh
###sysinclude args.uh
###sysinclude io.uh
###sysinclude str.uh

#g argc 4 < { #s ."Usage:\n" 0 argv print SPACE 1 argv print ." inputdir outputdir\n" end
}
2 argv sto idirpath @idirpath 'd inv istrue { ."The given input directory doesn't exist! Exited.\n"  end }
3 argv sto odirpath @odirpath 'd inv istrue { ."The given output directory doesn't exist! Exited.\n" end }
#g @aktpath 100 mem sto aktpath
#g @aktpath 100 mem sto opath
#g @aktpath 100 mem sto scommand
@idirpath getdir { ."Cannot load the input  dir! Aborted.\n" end } sto idir
@odirpath getdir { ."Cannot load the output dir! Aborted.\n" end } sto odir
@idir ~r { //."Regular files:\n"
@idir ~r  {{ #s
@idir 'r {{}} getfilename sto fname
opath  @odirpath = opath per
@fname sum opath
@opath 'r inv istrue { // The input file must be copied
aktpath @idirpath = aktpath per
@fname sum aktpath
scommand "cp " =
@aktpath sum scommand
" " sum scommand
@opath sum scommand
@scommand printnl
@scommand shell
}
@fname inv mem
}}
}
// Create the nonexistent directories if necessary:
@idir ~d { //."Directories:\n"
@idir ~d  {{ #s
@idir 'd {{}} getfilename sto fname
opath  @odirpath = opath per
@fname sum opath
@opath 'd inv istrue { // The dir must be created:
scommand "mkdir " =
@opath sum scommand
."Create output dir: " @scommand printnl
@scommand shell
}
@fname inv mem
}}
}
// ...................................
@idir ~d { //."Directories:\n"
@idir ~d  {{ #s
@idir 'd {{}} getfilename sto fname
scommand "peri psync.upu " =
@idirpath sum scommand
scommand per
@fname sum scommand
" " sum scommand
@odirpath sum scommand
scommand per
@fname sum scommand
@fname inv mem
@scommand shell
}}
}
@idir inv mem
@odir inv mem
@aktpath inv mem
@opath inv mem
end
// =============================================
{ „scommand” }
{ „aktpath” }
{ „opath” }
{ „fname” }
{ „idirpath” }
{ „odirpath” }
{ „idir” }
{ „odir” }

Gyönyörűen működik! Igaz, faék-egyszerűségű (de legalább SEMMIFÉLE függősége nincs is!), azt hogy kell-e egy fájlt másolni egyszerűen úgy dönti el, létezik-e olyan nevű fájl az adott directoryban vagy sem. Nem figyel méretet, létrehozási dátumot meg hasonlókat. Bele lehetne építeni ezt is simán, a Perihez írt directorykezelő libem képes efféle huncutságokat lekérdezni, de nekem felesleges most.

Szóval ez úgy működik, hogy megadjuk az input és output directorykat neki, ekkor az inputból minden hiányzó fájlt átmásol az outputba. Aztán megnézi az output dirből melyik alkönyvtárak hiányoznak amik az inputban benne vannak, ezeket is létrehozza, majd az input dir minden alkönyvtárára meghívja önmagát rekurzívan, a shellen át, megfelelőképpen felparaméterezve a parancssort, azaz megadva az új input és output könyvtárakat paraméterként...

A fájlok másolása, a könyvtárak létrehozása is shell paranccsal történik.

Nyilván ennek van bizonyos overloadja, de szerintem ez simán tolerálható, egyrészt mert ritkán kell használnom, másrészt, ilyen feladatnál az igazán jelentős időszükséglet nem az hogy a shellt hívjuk, a vele járó forkolás meg ilyesmi, hanem maga a másolás az ami jelentős ideig tart, még akkor is ha a cél egy SSD egység, hát még mint nálam amikor merevlemezre archiválok gigabájtos méretű fájlokat...

A Peri maga is képes rá hogy benne rekurzív programokat írjunk meg, shell nélkül, de nem akartam agyonbonyolítani. Verébre se lövünk atombombával.

Szerintem egy igazán remek, hasznos kis program született most a kezem alatt, az biztos hogy nagyon megkönnyíti majd a dolgomat a jövőben. Nagyon ritkán kell majd, de akkor aranyat ér!