#! /bin/bash # # Usage: mytree [ dir ... ] # # prints statistics about a directory tree # # hvf 06.01.04 22.01.04 # Version 4 mit find # Version 8 mit bash builtin Arithmetik DIRS=0; REG=0; LINKS=0; PIPES=0; SOCKETS=0; CDEV=0; BDEV=0; OTHERS=0; TOTAL=0 function doit() { # does one level of directories and calls all subdirs for i # in $* do DIRLIST="`find $i -type d -maxdepth 1 -mindepth 1 | sort`" T=0 for x in f d l p s b c # Schleife durch alle Dateitypen do ANZ=`find $i -type $x -maxdepth 1 -mindepth 1 | wc -l` case $x in f) R=$ANZ # regular file ((REG=$REG + $R));; d) D=$ANZ # directory ((DIRS=$DIRS + $D));; l) L=$ANZ # symbolic link ((LINKS=$LINKS + $L));; p) P=$ANZ # named pipe ((PIPES=$PIPES + $P));; s) S=$ANZ # socket ((SOCKETS=$SOCKETS + $S));; b) B=$ANZ # block device ((BDEV=$BDEV + $B));; c) C=$ANZ # character device ((CDEV=$CDEV + $C));; esac ((T=$T + $ANZ)) done ((TOTAL=$TOTAL + $T)) printf "%6d%6d%6d%6d%6d%5d%5d%6d%6d %s\n" $D $R $L \ $P $S $C $B $OTHERS $T $i [ -n "$DIRLIST" ] && doit $DIRLIST done return } echo " Dirs Reg Lnks Pipes Socks Cdev Bdev Other Total Directory" echo "-----------------------------------------------------------------------" # Die Funktion doit arbeitet rekursiv die übergebenen Directories ab if test $# -eq 0 then doit . else doit $* fi echo "-----------------------------------------------------------------------"; printf "%6d%6d%6d%6d%6d%5d%5d%6d%6d %s\n" $DIRS $REG $LINKS \ $PIPES $SOCKETS $CDEV $BDEV $OTHERS $TOTAL total echo "-----------------------------------------------------------------------" exit 0