Zkouška 10.6. Forst

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.

Zkouška 10.6. Forst

Příspěvekod krystof.m » 10. 6. 2010 19:36

Dostali jsme za úkol napsat program baf, který dostane jako parametry dva adresáře (říkejme jim source a dest) a má je synchronizovat. Každý z těchto adresářů a libovolný podadresář může obsahovat konfigurační soubor _default.baf, v tom jsou řádky ve tvaru:

Kód: Vybrat vše
+PATTERN
-PATTERN
+PATTERN/
-PATTERN/


PATTERN je regexp, nebo wild card (mohli jsme si vybrat). / znamená, že se daný řádek týká adresářů, jinak se týká souborů a +/- značí, jestli se soubory/adresáře matchující PATTERN mají zpracovávat, nebo ne. Pokud pro nějaký soubor z daného adresáře neexistuje matchující PATTERN, soubor se zpracovává.

Konfigurační soubor je platný pro adresář, ve kterém je a pro všechny syny, pokud v nich zase není jiný konfigurák. Pokud se vyskytuje konfigurák v source i dest, platí ten v source (třeba), pokud se vyskytuje právě v jednom ze synchronizovaných adresářů (podadresářů), bere se ten jeden a pokud tam žádný není, dědí se (platí ten z otce/jeho otce..).

Pokud se zpracovávaný soubor vyskytoval jenom v source nebo jenom v dest, měl skript uživateli nabídnout následující možnosti: Skip, Copy-výchozí, Delete. Myslím, že je zřejmé, co znamenají. Pokud existují oba soubory, přibyda možnost Revoke. Copy pak znamená nahrazení starého souboru novým (menšího větším v případě schody v čase), Revoke naopak, Delete maže oba soubory.

Pokud se zpracovávaný adresář vyskytoval jenom v source nebo jenom v dest, měl uživatel dostat možnosti: Skip-výchozí, Create, Tree, Delete. Create na daném místě vytvoří prázdný adresář a později se bude skript ptát na synchronizaci obsahu. Tree vytvoří daný adresář a navíc ho synchronizuje bez dalšího vyptávání a použije při tom výchozí hodnoty (skip pro podadresáře a copy pro soubory). Pokud existují oba adresáře, synchronizují se.

Všude bylo potřeba zachovávat datum a čas modifikace. Symlinky se měly následovat.

Náznak mého náznaku řešení:
Jedna rekurzivní funkce ProcessDir se čtyřmi parametry $source $dest $conf $tree, $conf je cesta k nejbližšímu nadřazenému konfiguráku, $tree je příznak, který říká, jestli se mám ptát uživatele, nebo ne. Zkontroloval jsem, jestli je v místě konfigurák, pokud ne, použil se ten, co přišel zhůry. Findem jsem si prvně vypsal jenom soubory z $dest, pro každý jsem se kouknul do konfiguráku, jestli se má zpracovávat (dělal jsem to blbě, řešení bylo dost, třeba projít konfigurák v cyklu a pokaždé zkusit grepem matchovat daný řádek na název souboru), pokud se soubor zpracovávat měl, podíval jsem se do dest a podle toho jestli tam byl a jestli se soubory shodovaly nabídl skript uživateli potřebné možnosti.
Potom se řešili soubory z dest, které nejsou v source (já jsem vypsal findem všechno a pak jsem testoval testem, jestli tam jsou, ale jsou i chytřejší řešení).
Nakonec jsem zpracoval adresáře, na ty které jsou v source i dest se funkce jenom rekurzivně zavolala. Jinak bylo potřeba uživateli nabídnou příslušné možnosti.
(Bacha! Tree není cp -r, ale vytvoření adresáře a jeho synchronizace bez vyptávání, ale s použitím konfiguráků)

To je zhruba vše. Ještě přibližná statistika: Přišlo nás asi 21, dva odešli rovnou (1 neměl zápočet). Odevzdávalo asi 18. "Nepotěšili jste mě, ani já vás nepotěším." Dvě jedničky, jedna dvojka, jedna trojka, čtyři nebo pět pohovorů a zbytek šel domů.
krystof.m
Matfyz(ák|ačka) level I
 
Příspěvky: 2
Registrován: 10. 6. 2010 18:57
Typ studia: Informatika Mgr.
Login do SIS: mekutak

Zpět na SWI095 Úvod do UNIXu

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník