Úvod do UNIXu – cvičení 11. 3. 2016

Domácí úkoly

  1. Vytvořte shellový skript, který funguje v roli filtru (tj. čte standardní vstup a výstup své práce posílá na standardní výstup), jenž ze vstupu vypíše pouze prvních 9 řádek a poslední 4 řádky. U vstupů kratších než 13 řádek pak nevadí, pokud se vám některé řádky vypíší vícekrát. Příklad použití je např. cat /etc/passwd | ./ukol.sh. Samozřejmě ve skriptu smíte použít jen prostředky z již proběhlých cvičení a přednášek. (1 bod)

Řešení domácích úkolů z minula

  1. Dokončete skript z konce minulého cvičení podle zadání ve zvláštním souboru. Opravdu si zkuste se na u-ss alespoň "SSHčknout", ať si to vyzkoušíte. Skript, který řeší všechny zadané úkoly mi pak pošlete emailem jako přílohu. Nezapomeňte to nějak okomentovat – ať je jasné, k jakému úkolu každý příkaz patří. (3 body)
            
    #!/bin/bash
    
    # Nyní vytvoř shellový skript pro Bash, který postupně vykoná následující
    # kroky. Napiš jej třeba ve Vimu, jak chceš. Samozřejmě smíš používat pouze
    # prostředky z již proběhlých cvičení a přednášek.
    
    # -----------------------------------------------------------------------------
    # 1) Ve svém domovském adresáři vytvoř adresář 'ADRESAR'.
    # -----------------------------------------------------------------------------
    
    cd ~
    mkdir ADRESAR/
    
    # -----------------------------------------------------------------------------
    # 2) V nově vzniklém adresáři vytvoř adresáře 'A', 'B', 'C', 'D', 'E'.
    # -----------------------------------------------------------------------------
    
    cd ADRESAR/; mkdir A/ B/ C/ D/ E/
    
    # -----------------------------------------------------------------------------
    # 3) Do adresáře 'A' nakopíruj všechny soubory z adresáře '/usr/include', které
    # mají ve svém názvu alespoň jednu číslici a mají příponu '.h'.
    # -----------------------------------------------------------------------------
    
    cp /usr/include/*[0-9]*.h A/
    
    # -----------------------------------------------------------------------------
    # 4) Do adresáře 'B' nakopíruj všechny soubory z adresáře '/usr/include' a jeho
    # podadresářů až do úrovně 2 včetně. Názvy kopírovaných souborů musí splňovat,
    # že začínají na 'lib' a končí opět na '.h'. Při kopírování explicitně dovol
    # přepisování souborů stejných názvů.
    # -----------------------------------------------------------------------------
    
    cp -f /usr/include/lib*.h /usr/include/*/lib*.h /usr/include/*/*/lib*.h B/
    
    # Varianta výše funguje dle očekávání pouze někde, protože podle POSIXu není
    # chování definováno v případě, že cílový soubor již existuje a je produktem
    # předchozích kroků daného cp procesu. Např. na Solarisu to funguje. Naopak
    # GNU implementace soubory nepřepisuje a vypisuje varování. Řešením by byl
    # např. následující for cyklus.
    
    for i in /usr/include/lib*.h /usr/include/*/lib*.h /usr/include/*/*/lib*.h; do
      cp -f "$i" B/
    done
    
    # -----------------------------------------------------------------------------
    # 5) Přejmenuj adresáře 'A' a 'B' na 'ALPHA' a 'BETA'.
    # -----------------------------------------------------------------------------
    
    mv A/ ALPHA/
    mv -- B/ BETA/
    
    # -----------------------------------------------------------------------------
    # 6) Přesuň je oba do adresáře 'C'.
    # -----------------------------------------------------------------------------
    
    # 1. varianta
    mv ALPHA/ BETA/ C/
    # 2. varianta
    mv [AB]*/ C/
    # 3. varianta
    mv ??* C/
    
    # -----------------------------------------------------------------------------
    # 7) Vytvoř v adresáři 'ADRESAR' megasoubor 'all.h', který bude zřetězením
    # všech souborů v adresářích 'ALPHA' a 'BETA'. Hint: lze použít příkaz "tee",
    # viz slajdy k první přednášce a "man tee", na cviku jsme jej totiž zatím
    # nedělali.
    # -----------------------------------------------------------------------------
    
    # 1. varianta
    cat C/*/* | tee all.h
    # 2. varianta
    cat C/*/* | tee all.h | tail -n 1 | head -n 0
    # 3. varianta
    cat C/*/* > all.h
    
    # -----------------------------------------------------------------------------
    # 8) Zde vypiš na výstup, kolik bajtů dat soubor 'all.h' obsahuje. Z tohoto
    # příkazu chci jen jedno konkrétní číslo. Nic okolo toho.
    # -----------------------------------------------------------------------------
    
    # 1. varianta
    cat all.h | wc -c
    # 2. varianta
    wc -c all.h | cut -d ' ' -f 1
    
    # Mimochodem následující varianta je velmi elegantní způsob, jak spojit řešení
    # úkolů 7) a 8) do jedné kolony. © 2016 Markéta
    
    cat C/*/* | tee all.h | wc -c
    
    # -----------------------------------------------------------------------------
    # 9) Smaž všechny soubory v adresáři 'ALPHA'.
    # -----------------------------------------------------------------------------
    
    rm -f C/ALPHA/*
    
    # -----------------------------------------------------------------------------
    # 10) Smaž celý adresář 'C' jedním příkazem. Fakt pozor, ať si omylem nesmažeš
    # něco, co nechceš! To bych nerad. Víš jak, UNIX je, jak říká dr. Forst,
    # takovej "Chtěl(a)s to? Chtěl(a)s to!" a neptá se. :-)
    # -----------------------------------------------------------------------------
    
    rm -rf C/
    
    # -----------------------------------------------------------------------------
    # 11) Smaž adresáře 'D' a 'E' jedním bezpečným příkazem.
    # -----------------------------------------------------------------------------
    
    rmdir D/ E/
    
    # -----------------------------------------------------------------------------
    # 12) Vytvoř prázdné soubory 'x0', 'x1', 'x2', 'x3', 'x4', 'x5'.
    # -----------------------------------------------------------------------------
    
    touch x0 x1 x2 x3 x4 x5
    
    # -----------------------------------------------------------------------------
    # 13) Jedním příkazem je zas smaž až na soubor 'x1'.
    # -----------------------------------------------------------------------------
    
    # 1. varianta
    rm x0 x2 x3 x4 x5
    # 2. varianta
    rm x0 x[2-5]
    # 3. varianta
    rm x[02-5]
    
    # -----------------------------------------------------------------------------
    # 14) Ukliď po sobě zbylé soubory a adresáře.
    # -----------------------------------------------------------------------------
    
    rm -rf ~/ADRESAR/
    
    # -----------------------------------------------------------------------------
    # 15) Vypiš své jméno jako podpis. To je celé. ;-)
    # -----------------------------------------------------------------------------
    
    # 1. varianta
    echo "Michal Wirth"
    # 2. varianta
    echo "Frikulín vod Tabule"
    # 3. varianta
    whoami
            
          

Příkazy a úkoly na cvičení