Kód: Vybrat vše
+PATTERN
-PATTERN
+PATTERN/
-PATTERN/
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ů.