BASH - cvičení

Pokud v domovském adresáři nemáte public_html, tak si vytvořte tento link:
ln -s /usr/html/"uživatelské jméno" public_html

do souboru .bash_profile si nastavte proměnné:
odkud=/usr/html/NMIN266
kam=~/NMIN266
stejné proměnné si nastavte také pro aktuálně spuštěný BASH

Zkopírujte si tyto soubory:
cp $odkud/6/malapismena.tar.gz $kam/
cp $odkud/6/tex2.tar.gz $kam
  1. Vytvoříme si knihu Fimfárum na webových stránkách

    přepněte se do ~/public_html
    vytvořte adresář fimfarum a přepněte se do něj
    (mkdir ~/public_html/fimfarum;cd fimfarum)
    zkopírujte si /usr/html/NMIN266/fimfarumhtm.tar do ./
    (cp /usr/html/NMIN266/fimfarumhtm.tar ./)
    rozbalte jej
    (tar xvf fimfarumhtm.tar)
    vytvořte soubor index.htm, ve kterém bude seznam všech souborů s koncovkou htm
    (ls *htm > index.htm)
    	01-kolobezka.htm
    	02-fimfarum.htm
    	03-obri.htm
    	04-listi_z_dubu.htm
    	05-barka.htm
    	06-lina.htm
    	07-more.htm
    	08-sen.htm
    	09-sestry.htm
    	10-palecek.htm
    	11-nebojsa.htm
    	12-synove.htm
    	13-veterani.htm
    	14-vrabec.htm
    	15-hrbaci.htm
    	16-usporna.htm
    
    soubor index.htm si otevřete ve vim a pomocí regulárního výrazu upravte všechny řádky na tvar:
    <a href=xxxxx.htm>xxxxx.htm</a><br>
    kde xxxxx je název příslušné kapitoly
    (:%s/^\(.*\)/<a href=\1>\1<\/a><br>/)

    ve webovém prohlížeči si otevřete adresu https://www.karlin.mff.cuni.cz/~[vaše uživatelské jmého]/fimfarum
    dostanete seznam kapitol - zkuste na některou kliknout ...
    v souboru je "v nepořádku" čeština - opravíme ji tak, že na začátek každého souboru přidáme
    <meta charset=utf-8>
    nebudeme to dělat po jednotlivých souborech, ale použijeme cyklus v bash
    	for f in [0-9]*
    do mv $f $f.00 # echo "<meta charset=utf-8>" > $f cat $f.00 >> $f done
    teď můžeme zkontrolovat na webu jestli je četina v pořádku ...
    ... toto byla dlouhá příprava
    vše to uděláme (o něco lépe pomocí krátkého skriptu)
    	#!/bin/bash
    	echo "<meta charset=utf-8> > index.htm
    	for f in *htm
    	do
    	nazev=`head -n 1 $f`
    	mv $f $f.00
    	echo "<meta charset=utf-8> >> $f
    	cat $f.00 >> $f 
    	echo "<a href=$f>$nazev</a><br>" >> index.htm
    	done
    	rm *.00
    
  2. vytvořte soubor bmi.sh, který bude počítat BMI (bmi=hmotnost/(vyska2)) a to takto:
  3. mazání souborů *.log v aktuálním adresáři bez chybových hlášek
    přepněte se do ~/NMIN266/tex2/
    rozbalte si soubor $kam/tex2.tar.gz
    smažte všechny soubory *.log v adresáři letter
    a pak to zkuste ještě jednou - dostaneme chybovou hlášku
    rm: cannot remove `*.log': No such file or directory
    vytvořte skript, který smaže v daném adresáři všechny soubory *.log bez chybových hlášek mazani1.sh
      #!/bin/bash
      for f in `ls * | grep "\.log"`;
      do
        rm $f;
      done
      
    skript otestujte (spusťte ho 2x) v adresáři ~/NMIN266/tex2/ruzne
    ... existuje jednodušší řešení?
  4. mazání souborů *.log v aktuálním adresáři a jeho podadresářích bez chybových hlášek navíc s informací kolik souborů bude smazáno
    mazani2.sh
     #!/bin/bash
     echo "Bude smazáno "
     find ./ -name "*.log" | wc -l
     echo souborů s koncovkou log.
     for f in `find ./ -name "*.log"`;
      do
       rm $f;
     done
    
  5. mazání souborů, které nemají koncovku tex nebo pdf mazani3.sh
     #!/bin/bash
     for f in `find * | grep -v "\.tex" | grep -v "\.pdf"`;
      do
       rm $f;
     done
    
    POZOR ! soubory s koncovkou sh budou také smazány ...
    při spuštění tohoto skriptu se objeví chybové hlášení při pokusu o mazání adresáře
    možná dvě řešení:
    nepříliš korektní:
     #!/bin/bash
     for f in `find * | grep -v "\.tex" | grep -v "\.pdf" | grep -v "\.sh"`;
     do
       rm $f 2>/dev/null;
     done
    
    lepší řešení:
      #!/bin/bash
     echo souborů.
     for f in `find * | grep -v "\.tex" | grep -v "\.pdf" | grep -v "\.sh"`;
     do
       if [ ! -d $f ]
       rm $f;
     done
    
  6. změna názvů souborů na malá písmenka
    rozbalte si soubor
    malapismena.tar.gz
    pomocí příkazu tr můžeme převést řetězec napsaný velkými písmeny na malá
    echo ABC | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
    
    vytvoříme skript, který přejmenuje všechny soubory v adresáři i podadresářích, tak aby názvy byly jen malými písmeny
    mala.sh
     #!/bin/sh
     for f in `find ./ -name "*"`;
     do
       mv $f `echo $f | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"`;
     done
    
    malé vylepšení (bez chybových hlášek)
     #!/bin/sh
     for f in `find ./ -name "*" | grep [A-Z]`;
     do
       mv $f `echo $f | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"`;
     done
    
  7. 5.úloha 1. z 7.3.2024 efektivněji
    smazání adresáře ~/NMIN266/fimfárum
    rozbalte si soubor fimfarum.tar.gz
    vytvořte si adresáře dokumenty a obrazky presun1.sh
     #!/bin/sh
     for f in `file soubor* | grep PDF | sed 's/:.*$//'`;
       do
         mv $f ./dokumenty/${f}.pdf;
       done
    
     for f in `file soubor* | grep PNG | sed 's/:.*$//'`;
       do
         mv $f ./obrazky/${f}.png;
       done
    
     for f in `file soubor* | grep JPEG | sed 's/:.*$//'`;
       do
         mv $f ./obrazky/${f}.jpeg;
       done
    
    anebo
    příprava:
    novejmeno=`file soubor01 | sed "s/^\(.*\): \([A-Z\]*\).*$/\1.\2/"`
    echo $novejmeno
    
    nyní v cyklu:
    for f in `find *`; 
    do
    novejmeno=`file $f | sed "s/^\(.*\): \([A-Z\]*\).*$/\1.\2/"`;
    mv $f $novejmeno;
    done
    
  8. Zkopírute si soubor /usr/html/NMIN266/foto.tar.gz do svého domovského adresáře
    rozbalte ho příkazem:
    tar xzvf foto.tar.gz
    
    Původní zazipovaný soubor smažte.
    rm foto.tar.gz
    
    V adresáři foto jsou čtyři složky 2011,2012,2013,2014
    v každé složce je několik dalších složek v kterých jsou jednak
    fotografie ve formátu jpg, ale také ve formátu "raw" tj. soubory
    s koncovkou nef. Naším úkolem bude:
  9. Vytvořte si soubor emaily.txt s tímto obsahem:
    richter
    linek
    salavcova
    slefrova
    zahorec
    
    Pomocí RE přidejte na konec každého řádku @karlin.mff.cuni.cz (ESC :%s/$/@karlin.mff.cuni.cz)
    Z /usr/html/NMIN266/ si do stejného umístění zkopírujte soubory swans.jpg a escher.txt
    naším úkolem bude rozeslat všem lidem ze souboru emaily.txt rozeslat dopis kde:
    subject: escher
    tělo dopisu: eshcer.txt
    příloha dopisu:swans.jpg
    
    Pro rozesílání použijeme program mutt s těmito parametry:
    mutt -s "subject" "emailova adresa"  < telo dopisu (soubor) -a priloha ;echo emailova aderesa Odeslano; sleep 2;
    
    BASH skript bude vypadat takto:
    #!/bin/bash
    dopis=escher.txt
    priloha=swans.jpg
    subject="M.C.Escher"
    for email in `cat emaily.txt`
    do
    mutt -s "$subject" "$email"  < $dopis -a $priloha ;echo $email Odeslano; sleep 2;
    done