Programování v shellu
Hledání, archivace a komprese souborů

Lukáš Bařinka

Náplň cvičení

Cílem cvičení je pokročilá práce se soubory,
jejich vyhledávání, archivace a komprese.

  • Hledání souborů - příkaz find
  • Archivace souborů - příkaz tar
  • Komprese souborů - příkaz gzip

find

  • find kde... výraz
  • Hledání probíhá rekurzivně
  • Pokud je pro soubor (položku) výraz pravdivý,
    vypíše se jeho jméno s cestou (implicitně)
  • Místo výpisu jména je možné provést i jinou akci
    (vypsat podrobnosti, smazat soubor, spustit příkaz, ...)
  • Výpis všech položek (souborů) rekurzivně
    
    									fray1:~N=/dev/null
    
    									fray1:~find /etc
    									fray1:~find /etc >$N
    									fray1:~find /etc 2>$N
    								
  • Podrobný výpis všech položek (souborů) rekurzivně
    
    									fray1:~find /etc -ls 2>$N
    								
  • Filtrování podle vlastností
    
    									fray1:~find /etc -name nsswitch.conf -ls 2>$N
    									fray1:~find /etc -name '*.conf' -ls 2>$N
    									fray1:~find /etc -type d -ls 2>$N
    									fray1:~find /etc -size 0 -ls 2>$N
    									fray1:~find /etc -user netcfg -ls 2>$N
    									fray1:~find /etc -mtime 1 -ls 2>$N
    								
  • Numerické hodnoty (n =, +n >, -n <)
    
    									fray1:~find /etc -mtime 1 -ls 2>$N
    									fray1:~find /etc -mtime -1 -ls 2>$N
    									fray1:~find /etc -mtime +10000 -ls 2>$N
    
    									fray1:~find /etc -size 1 -ls 2>$N
    									fray1:~find /etc -size -10c -ls 2>$N
    								
  • Logické operátory (výchozí je AND)
    
    									fray1:~find /etc -type f -links +1 -ls 2>$N
    									fray1:~find /etc ! -user root -name '*.conf' -ls 2>$N
    									fray1:~find /etc \( \( -type f -links +1 \) -o \
    									\( -type d -links +5 \) \) -ls 2>$N
    								
  • Akce výpisu (implicitní/explicitní)
    
    									fray1:~find /etc -user netadm 2>$N
    									fray1:~find /etc -user netadm -print 2>$N
    									fray1:~find /etc -user netadm -ls 2>$N
    									fray1:~find /etc -user netadm -ls -type f 2>$N
    									fray1:~find /etc -user netadm -ls -type f -print 2>$N
    								

Spuštění příkazu

  • -exec příkaz a jeho argumenty... \;
  • -exec příkaz a jeho argumenty... {} +
  • Příkaz je spouštěn přímo příkazem find, nikoliv shellem
  • Návratový kód příkazu určí pravdivostní hodnotu
  • Spuštění příkazu
    
    									~N=/dev/null
    
    									~find ps -name '*.sample' -exec ls -i {} \; 2>$N
    
    									~find ps -name '*.sample' -exec wc -l {} \; 2>$N
    
    									~find ps -name '*.sample' -exec wc -l {} + 2>$N
    								
  • Spuštění příkazu - návratová hodnota ⇨ logická hodnota
    
    									~find ps -type f \
    									-exec grep -li '#!/bin/bash' {} + 2>$N
    
    									~find ps -type f \
    									! -exec grep -qi '#!/bin/bash' {} \; -ls 2>$N
    
    									~find ps -type f \
    									-exec grep -qi '#!/bin/bash' {} \; \
    									-exec wc -l {} + 2>$N
    								

Archivace

  • Cílem archivace je uložení informací z filesystému
    • obsahu souborů
    • metadat souborů
    • jmen souborů a adresářové struktury
  • tar - jeden z příkazů pro archivaci (Tape ARchiver)
    • Uložení archivu probíhá standardně na zařízení
    • Archiv může být také v souboru nebo na vstupu/výstupu
  • Příprava dat
    
    									~mkdir data
    									~echo aaa >data/a
    									~echo bbb >data/b
    									~ln data/a data/hard
    									~ln -s b data/soft
    									~chmod 400 data/b
    									~ls -l data
    								

tar akce [volby] [argumenty]

  • Vytvoření archivu (create)
    
    									~tar -cf data.tar data
    									~ls -l data.tar
    									~less data.tar
    									~file data.tar
    								
  • Výpis archivu (list)
    
    									~tar -tf data.tar
    									~tar -tvf data.tar
    								
  • Aktualizace archivu (diff, update)
    
    									~echo a >data/a
    									~tar -df data.tar data
    									~tar -uf data.tar data
    									~tar -tvf data.tar
    								
  • Rozbalení archivu (extract)
    
    									~rm -r data
    									~tar -xf data.tar data/b; ls -l data
    									~tar -xvf data.tar; ls -l data
    									~tar -xf data.tar -C /tmp; ls -l /tmp/data
    								
  • Archivace podle seznamu souborů
    
    									~printf '%s\n' data/? >list
    									~tar -cf arch -T list
    									~tar -tvf arch
    
    									~find data -type f -name '?' | tar -cf arch -T -
    									~tar -tvf arch
    								

Komprese

  • Cílem archivace je zmenšení původního souboru při zachování všech dat
  • Soubor je přepsán komprimovaným/dekomprimovaným souborem
  • Kompresi lze provádět na std. vstup/výstup
  • Příprava dat
    
    									~getent passwd >f1
    									~getent group >f2
    									~ls -l f[12]*
    								
  • Komprese souboru
    
    									~gzip f1
    									~ls -l f[12]*
    									~gzip f2
    									~ls -l f[12]*
    								
  • Dekomprese souboru
    
    									~gunzip f1 f2
    									~ls -l f[12]*
    								
  • Podrobnosti de/komprese souboru
    
    									~gzip -v f1 f2
    									~gunzip -v f1 f2
    								
  • De/komprese std. vstupu
    
    									~gzip <f1
    									~gzip <f1 >f1.gz
    									~ls -l f[12]*
    									~gunzip <f1.gz >f1
    								
  • Archivace a komprese jako filtry
    
    									~tar -cf - data | gzip >data.tar.gz 
    									~gunzip <data.tar.gz | tar -xf -
    
    									~tar -czf data.tgz data
    									~tar -xzf data.tgz
    
    									~tar -cf - data | ( cd /tmp; tar -xf - )
    									~tar -cf - data | ssh fray1.fit.cvut.cz 'tar -xf -'