Úvod do UNIXu 2016/2017

0  1  2  3  4  5  6  7  8  9  10  11  12 

Cvičení IX

  1. Úkol z minulé hodiny
  2. Napište v bashi faktoriál, použijte rekurzi.
    • fac () {
      acc=$1
      if [[ $acc -gt 1 ]]; then
      ff=`fac $((acc - 1))`
      res=`expr $ff \* $acc`
      echo $res
      else
      echo $acc
      fi
      }
      fac $1
  3. Napište skript, který každých 5 vteřin zkontroluje obsah daného adresáře (vytvořte). Pokud je adresář prázdný, skript běží dál. Pokud se v něm objeví soubor, skript skončí.
    • dir=$1
      while [ -z `ls $dir` ]; do
      sleep 5
      done
  4. Vyrobte skript, který vezme adresář a startovní číslo a bude vypisovat sekvence začínající tímto číslem s krokem 2 a po zadaném čase. Pusťte jej 2x na pozadí. Ten, který skončí první zabije všechny ostatní.
  5. Vytvořte nezastavitelný skript.
    • trap "" 2 15
      while true; do
      echo RUNNING
      sleep 1
      done
  6. Zjistěte, ve kterých adresářích uložených v proměnné $PATH se vyskytuje program awk
  7. echo $PATH | tr ':' '\n' | xargs -I{} find {}/awk -prune 2>/dev/null
  8. Napište skript reverse, který vypíše své parametry na standardní výstup v opačném pořadí. Například reverse a b c d vypíše d c b a.
  9. Napište skript, který očekává jeden až dva číselné parametry. První číselný parametr pak zarovná na počet míst zadaných druhým číselným parametrem. Druhý parametr má výchozí hodnotu 5.

Dnešní témata

Úkol 9 (3 body):
Vytvořte skript, který bude fungovat jako základní příkaz find.
Tedy vezme cestu k adresáři a typ souboru a rekurzivně nalezne všechny soubory daného typu.
Stačí uvažovat typy f - file, d - directory a l - symlink.
Nepoužívejte příkaz find, ls -R či cokoliv podobného, rekurzivní průchod vyřešte sami.

    • fnd() {
      for file in `ls -A $1`; do
      case $2 in
      d)
      [ -d "$file" ] && echo $file
      ;;
      f)
      [ -f "$file" ] && echo $file
      ;;
      l)
      [ -L "$file" ] && echo $file
      ;;
      esac
      [ -d "$file" ] && [ ! -L "$file" ] && fnd $file $2
      done
      }
      fnd $1 $2