Forst 4. 6. 2015 - globsub

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.
Uživatelský avatar
petrroll
Matfyz(ák|ačka) level I
Příspěvky: 12
Registrován: 23. 5. 2015 22:27
Typ studia: Informatika Bc.

Forst 4. 6. 2015 - globsub

Příspěvek od petrroll »

Úkol: Zbrusu nový příklad globsub určený k hromadnému nahrazení určitého patternu nějakým stringem ve všech souborech zadaných adresářů (viz příklad z přednášky nahrazení všech (c) 2015 za (c) 2016.

Přesné zadání:
Napište skript globsub s následujícími parametry:
[options]:
-q : quiet, bez výpisu (viz dále), plus implikuje přepínač -y
-y : yes, na jednotlivých souborech se neptá jestli na nahrazování, prostě to automaticky udělá
-d : dry-run, jen vypíše co by nahradil, ale substituci přímo neprovádí
-p : preserve, při substituci zachovejte původní datum změnění souboru

[cesty k adresářům, ve kterých se mají hledat soubory pro substituci]
-může jich být více
-když chybí, brát aktuální adresář

[lines]
-regex, který říká, na jakých řádcích se má provádět daná substituce (když prázdný, tak pro všechny řádky)

pattern
-regex, říkající co se na dané řádce má přesně nahradit

substitute
-literal string toho, čím se nahradí pattern

=

Parametr zadaný na začátku skriptu (přímo v něm, jako proměnná):
SUFF
- říká, jaké koncovky mají mít soubory, u kterých chceme substituovat
- využívají shellové wildcardy
- může jich být více (pak or), oddělené mezerou
==
Přesné zadání:
Napište program, který pro všechny soubory ze zadaných adresářů (i jejich podadresářů) splňující daný SUFF sufix provede na řádcích odpovídajících lines substituci pattern (to, co pattern regex matchne) za subtitute (literal string). Před samotnou substitucí vypište pro každý soubor jeho název a za tím řádky, které se budou měnit, a to v již změněné variantě (tj. jak budou vypadat po substituci). Následně se uživatele zeptejte, zda chce změny provést. Uživatel může odpovědět následující:
yes / jen enter bez ničeho: Ano, proveďte substituci
all : Ano, proveďte subtituci a na další soubory se neptejte a substituujte rovnou (ale stále vypisujte jak "by změny vypadaly")
dir : Ano, proveťe subtitutici a na další soubory, které jsou ze stejného adresáře / z adresářů pod adresářem aktuálního souboru se neptejte a substituujte rovnou (ale stále vypisujte jak "by změny vypadaly")
no : Nesubstituujte, pokračujte na další soubor
quit: ukončete skript

V případě volby dryrun se provádí jen první vypisování, jak by změny vypadaly. Uživatele se skript na nic neptá a žádné substituce neprovádí. Při volbě quiet se zas hned provádí substituce a nic se nevypisuje. Přepínač yes funguje jako odpověď all před prvním souborem. A nakonec přepínač preserve má zajistit to, že po substituci se neaktualizuje datum změny souboru.

===
Výsledky:
Přišlo nás 17, 3 vyhodil, s 6 chtěl mluvit (z toho jeden za 2 co vím), 3? dostali za dva, 5? za jedna. Plus mínus jedna sem a tam. Obecně ale říkal, že buď jsme fakt dobří nebo je ten příklad moc lehký, tj. asi ho úspěšnost (mile) překvapila. Což ale asi taky znamená, že průměrný příklad / termín bývá těžší...

===
Hinty (řečené až po zkoušce):
-Na zjištění souborů, které se budou měnit, použít find (s tím, že i sufix se tam použije skrz -name *$SUFF
--(!!! Potřeba tu chytře vyřešit to, že v SUFF může být víc přípustných suffixů, pak roztrhnout do ořítek, které find umí !!!)).
-V případě, že arg. line chybí, tak mu dát hodnotu, která matchne všechny řádky a neřešit tak složité if then stromy.
-Na preserve použít chytrou vlastnost touche, která zkopíruje timestamp jednoho souboru jinému (tj. není třeba ze souborů složitě extrahovat changed date a pak ho novým dávat)
-Daná substituce se nejlíp řeší jedním sedem "sed -ri /line/ s/pattern/sibstitute", s tím, že je ještě třeba v line, pattern, i substitute escapovat dopředná lomítka a uvozovky

==

Zdání ze zkoušky:
-Úplně nejde po blbých syntaktických chybách
--Na ústních se vás může zeptat na to, proč v <<for i in "$QUAK">> máte okolo $QUAK uvozovky a že je to blbost, ale když mu odpovíte tak ok.
-Dokáže ocenit (a IMHO to dokáže subtitutovat chyby jinde), když použijete něco z toho, co říkal na přednášce a celkově se u toho zamyslíte a šetříte si práci
-Spíš asi nemá rád opakování kódu (tj. např. vzít kód, označit ho svorkou a udělat šipku vedle, že tam patří taky je no-no, má se použít fce).

===

Počítač tradičně jeden pro všechny. Tak polovinu času jsem u něj byl já, jinak by byl spíš prázdnej. Takže toho se fakt člověk nemusí bát.
anonym64578

Re: Forst 4. 6. 2015 - globsub

Příspěvek od anonym64578 »

Na ústním to bylo v pohodě. Prošli jsme kód od začátku do konce & kde byla chyba, tak se zastavil.
Chtěl vysvětlit proč je tam chyba & jak bych jí opravil. A většinou to byly přesně ty věci na které upozorňoval na přednášce :wink: [viz. třeba uvozovky proměnné ve for cyklu výše]

Také komentoval některé části kódu, že nedávají moc smysl a jsou zbytečně složité. Ale nevím, jak moc tomu přikládal váhu při známkování.

Jediná věc, co mě trošku zaráží, je, že si mě zavolal na opravu. Tam jsem mu řekl vesměs to co chtěl slyšet (tak 50/50). A pak mi řekl, že ten kód není špatný, používám tam to co nás učil, ale že ty ostatní, co mají za 1 ho mají hezčí, takže za 2. Tak nevím jestli jsem šel na ústní s tím, že mám 2-3 a vytáhl jsem to skoro na 1. Nebo jsem to měl 1-2 ale ústní jsem podělal, takže výsledná za 2...
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“