Zkouška 10.6. Forst

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: Zkouška 10.6. Forst

Zkouška 10.6. Forst

od krystof.m » 10. 6. 2010 20: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ů.

Nahoru