Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #
- # IOS 2019/2020: 1. Projekt
- # autor: Tomas Svoboda (xsvobo1v)
- # datum: 28. 3. 2020
- #
- POSIXLY_CORRECT=yes
- NORMALIZACE=0
- IGNOR=0
- # pracovni/aktualni adresar
- DIR=$(pwd)
- # pocet adresaru v adresarovem stromu
- ND=0
- # pocet vsech obycejnych souboru
- NF=0
- # napoveda k pouziti scriptu
- NAPOVEDA="Pouziti: ./diagraph [-i FILE_ERE] [-n] [DIR]
- -i ignoruje zadany FILE_ERE, nesmi se schodovat s korenovym adresarem DIR
- -n nastavi normalizaci
- DIR je umisteni prohledavaneho adresare, pri nezadani se prohledava aktualni."
- # Histogram velikosti souboru
- declare -A FSHIST
- FSHIST['<100B']=0
- FSHIST['<1KiB']=0
- FSHIST['<10KiB']=0
- FSHIST['<100KiB']=0
- FSHIST['<1MiB']=0
- FSHIST['<10MiB']=0
- FSHIST['<100MiB']=0
- FSHIST['<1GiB']=0
- FSHIST['>=1GiB']=0
- # univerzalni chybova hlaska s napovedou k spravnemu vyuziti scriptu
- function napoveda {
- echo "$NAPOVEDA" >&2
- exit 1
- }
- # vytiskne mrizky podle poctu souboru dane velikosti
- function mrizky
- {
- if [ "$1" -ne 0 ]; then
- eval printf '\#%.0s' {1.."$1"}
- fi
- }
- # Nastaveni prepinacu
- while getopts ni: o
- do case "$o" in
- n) NORMALIZACE=1
- ;;
- i) IGNOR="$OPTARG"
- ;;
- *) >&2 echo "ERROR: Je zadaný chybny prepinac, postupujete podle napovedy:"
- napoveda;;
- esac
- done
- # posun cesty na dalsi argument
- ((OPTIND--))
- shift $OPTIND
- # Nastaveni prohledavaneho adresare kdyz je zadan pouze [DIR]
- if [ $# -eq 1 ]; then
- DIR="$1"
- fi
- # Pokud je zadano moc argumentu
- if [ $# -gt 3 ]; then
- >&2 echo "ERROR: Prilis mnoho argumentu!"
- napoveda
- fi
- # Pokud je FILE_ERE korenovy adresar
- if [[ "$DIR" =~ $IGNOR ]]; then
- >&2 echo "ERROR: FILE_ERE se shoduje s prohledavanym adresarem DIR"
- napoveda
- exit 1
- fi
- # Cyklus prochazejici vsechny soubory pod zadanym adresarem
- while read soubor
- do
- if [[ "$soubor" =~ $IGNOR ]]; then
- continue
- fi
- # pokud je prohledavany soubor adresar, tak zvysi pocet ND
- if [ -d "$soubor" ]; then
- (( ND++ ))
- # nebo pokud je prohledavany soubor obycejny soubor, tak zvysi pocet NF
- elif [ -f "$soubor" ]; then
- (( NF++ ))
- # urci velikost souboru
- velikost=$(wc -c < "$soubor" | xargs)
- if [ "$velikost" -lt 100 ]; then
- (( FSHIST["<100B"]++ ))
- elif [ "$velikost" -lt 1024 ]; then
- (( FSHIST["<1KiB"]++ ))
- elif [ "$velikost" -lt 10240 ]; then
- (( FSHIST["<10KiB"]++ ))
- elif [ "$velikost" -lt 102400 ]; then
- (( FSHIST["<100KiB"]++ ))
- elif [ "$velikost" -lt 1048576 ]; then
- (( FSHIST["<1MiB"]++ ))
- elif [ "$velikost" -lt 10485760 ]; then
- (( FSHIST["<10MiB"]++ ))
- elif [ "$velikost" -lt 10485760 ]; then
- (( FSHIST["<100MiB"]++ ))
- elif [ "$velikost" -lt 1073741824 ]; then
- (( FSHIST["<1GiB"]++ ))
- elif [ "$velikost" -ge 1073741824 ]; then
- (( FSHIST[">=1GiB"]++ ))
- fi
- fi
- done <<< $(find "$DIR" -type f -or -type d 2> /dev/null)
- if [ "$NORMALIZACE" -eq 1 ]; then
- # 79 je maximalni delka radku pokud vystup skriptu neni v terminalu
- delka_radku=79
- # ziska delku radku pokud se vystup 1 nachazi na terminalu
- if [ -t 1 ]; then
- delka_radku=$(tput cols)
- (( delka_radku-- ))
- fi
- # ziska nejvetsi hodnotu v poli FSHIST
- max_hodnota=0
- for i in "${FSHIST[@]}"
- do
- if [ $i -gt $max_hodnota ]; then
- max_hodnota=$i
- fi
- done
- echo "$delka_radku" ############## debub vypis
- echo "$max_hodnota" ############## debub vypis
- if [ "$max_hodnota" -gt "$delka_radku" ]; then
- for j in "${!FSHIST[@]}"
- do
- ${FSHIST[$j]}=$(( ${FSHIST[$j]} * delka_radku / max_hodnota ))
- done
- fi
- fi
- echo "Root directory: $DIR"
- echo "Directories: $ND"
- echo "All files: $NF"
- echo "File size histogram:"
- printf " <100 B : " ; mrizky "${FSHIST['<100B']}"
- printf "\n"
- printf " <1 KiB : " ; mrizky "${FSHIST['<1KiB']}"
- printf "\n"
- printf " <10 KiB : " ; mrizky "${FSHIST['<10KiB']}"
- printf "\n"
- printf " <100 KiB: " ; mrizky "${FSHIST['<100KiB']}"
- printf "\n"
- printf " <1 MiB : " ; mrizky "${FSHIST['<1MiB']}"
- printf "\n"
- printf " <10 MiB : " ; mrizky "${FSHIST['<10MiB']}"
- printf "\n"
- printf " <100 MiB: " ; mrizky "${FSHIST['<100MiB']}"
- printf "\n"
- printf " <1 GiB : " ; mrizky "${FSHIST['<1GiB']}"
- printf "\n"
- printf " >=1 GiB : " ; mrizky "${FSHIST['>=1GiB']}"
- printf "\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement