23.6.2016 - find

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.

23.6.2016 - find

Příspěvekod Ondřej Nepožitek » 23. 6. 2016 16:38

Dnešním úkolem bylo naprogramovat FIND. Zadání je skoro stejné jako zde - viewtopic.php?f=379&t=817&p=1502&hilit=find#p1502 a dokonce i Forstův přístup ala "Dneska máte za úkol naprogramovat find. Můžete se pustit do práce." byl úplně stejný. Potom vysvětlil zadání.

Co to má umět:
1) více cest, kde se má začít prohledávat
2) podmínky:
-path wildcard .. wildcard řetězec; celá cesta mu musí odpovídat
-newer file .. soubory novější než file
-user name/uid .. jméno popř. uid vlastníka souboru
-type typ .. typ souboru; stejné jako první znak výpisu "ls -l" jen s výjimkou že "obyčejný soubor" je "f" a ne "-"
-depth d/+d/-d .. d je přesná hloubka souboru; -d je minimální hloubka souboru a +d je maximální hloubka souboru
3) akce:
-print .. výpis plné cesty; implicitní akce
-ls .. výpis ve tvaru "ls -l file"
-exec command ";" .. spustí se daný příkaz; {} se nahradí jménem souboru
4) usnadnění:
- každá podmínka je použita maximálně jednou
- akce je použita maximálně jedna, implicitní je print
- všechny podmínky i akce jsou navzájem v konjunkci, v parametrech nebudou žádné logické operátory
- můžeme očekávat že v názvech souborů nebudou konce řádek
5) omezení:
- zakázáno "-ot" a "-nt" u příkazu test
- zakázáno "ls -n"
6) skript má skončit s chybou při nesprávných parametrech

Forst po zkoušce nastínil 2 různě přístupy k této úloze:
1) Rekurze - tento postup by asi zvolil i on sám. Prohledávání adresářů do hloubky. Buď volat rekurzivně skript a nebo nějakou funkci. S rekurzí u funkcí prý může být obecně problém, ale tady by to podle něj nemělo vadit. Příkazem "ls" se vždy zjistí obsah daného adresáře a skript/funkce se pustí rekurzivně na všechny adresáře, na které to narazí. Moc se mu nelíbilo, pokud se pokračovalo v hledání i pokud byla již překročena maximální hloubka určená parametrem "-depth".
2) Pomocí "ls - R". Tohle řešení může být rychlejší (protože ls umí adresářový strom projít rychleji) ale za to je to složitější na programování. A pokud je zadán parametr "-depth" tak toto řešení může být i pomalejší než první varianta, protože se prohledává celý strom.

Řešení podmínek:
- path - nejlépe přes case
- newer - výpis "ls" se dá řadit dle času vytvoření souboru
- user - POZOR! - nepřevádět uid zvlášť u každého souboru na jméno uživatele.. udělat to na začátku skriptu a tuto hodnotu si uložit.. moc se mu nelíbilo že např. 100 000 krát otevřete /etc/passwd a vygrepujete jednu řádku
- type - např. porovnávat první znak výpisu "ls -l file"

Výsledky zkoušky:
Na zkoušku nás přišlo 14. Jeden řešení neodevzdal. Forst konstatoval, že písemky se daly rozdělit na 2 poloviny, co se kvality týče. Cca 6 lidí dostalo jedničku rovnou. Jeden nemohl na ústní. Zbytek si Forst pozval na ústní (že prý je konec června, tak dá každému šanci přinejmenším zjistit, co měl špatně, a případně zabojovat o známku). Výsledky ústní může někdo doplnit.
Ondřej Nepožitek
Matfyz(ák|ačka) level I
 
Příspěvky: 1
Registrován: 23. 6. 2016 15:56
Typ studia: Informatika Bc.

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