#!/usr/bin/env bash SUMMERY=false right_tabstop=30 warn (){ echo "" echo -e " [ Warning ] $*" echo "" } function usage() { echo [ -n "$1" ] && echo -e "Error: $1\n" cat< Prints out a summary of disk space usage for a given directory. The Output contains also the amount of diskspace usage of the subdirectories. Options: -o A summary file will be stored in the given directory. The filename contains the directory name of the determined directory and also a timestamp in human readable form. -q Suppresses the output to stdout. Only useful in conjunction with "-o" EOF exit 1 } _be_quiet=false _output_to_file=false while getopts o:q opt ; do case $opt in q) _be_quiet=true ;; o) _output_to_file=true if [ -d "$OPTARG" ]; then _out_dir=$OPTARG else usage "Output directory not found" fi ;; h) usage ;; \?) usage esac done shift `expr $OPTIND - 1` if [ $# -eq 0 ]; then usage "Missing parameter for \"\"" elif [ $# -gt 1 ]; then usage "To many parameters given" fi base_dir=$1 if [ ! -d $base_dir ]; then usage "Directory \"$base_dir\" not found!" fi if $_output_to_file ; then _out_file="${_out_dir}/`basename \"$base_dir\"`_space_usage.`date +%Y%m%d-%H%M`" touch $_out_file fi if $_be_quiet && ! $_output_to_file ; then warn "You have told me to be quiet (-q), but gives no output directory." exit fi ## - print out ## - outnl(){ echo X\\c > /tmp/shprompt$$ if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then if $_output_to_file ; then echo -e "$*\\c" >> $_out_file fi if ! $_be_quiet ; then echo -e "$*\\c" 1>&2 fi else if $_output_to_file ; then echo -e "$*" >> $_out_file fi if ! $_be_quiet ; then echo -e "$*" 1>&2 fi fi rm /tmp/shprompt$$ } outnl "" outnl "Disk Space Usage Directory \"$base_dir\":" outnl "" cd $backup_base_dir ## - Read list of (sub)directories inside $base_dir into ## - an array. ## - dir_list_arr=() while IFS='' read -r -d '' _dir; do dir_list_arr+=($_dir); done < <(find $base_dir -mindepth 1 -maxdepth 1 -type d -print0) ## - Sort the array ## - dir_list_sorted_arr=() readarray -t dir_list_sorted_arr < <(for a in "${dir_list_arr[@]}"; do echo "$a"; done | sort) for _dir in "${dir_list_sorted_arr[@]}"; do ## - Determin space usage of $_dir ## - _out_du=$(du -sh "$_dir") _space=`echo ${_out_du} | cut -d ' ' -f1` _host=`basename "$_dir"` ## - Formatted Output ## - ## - Determin number of signs between directory name ## - and directory size ## - _strlen=${#_host} _count_blank=`expr $right_tabstop - $_strlen` _str_blanks="" while [ $_count_blank -gt 2 ]; do _str_blanks="${_str_blanks}." _count_blank=`expr $_count_blank - 1` done _str_blanks="${_str_blanks}: " _outstring="\t${_host}${_str_blanks}${_space}" outnl "$_outstring" done ## - Summary ## - if $SUMMERY ; then ## - overall usage of directory $$base_dir ## - _overall_usage=`du -sh $base_dir | awk '{print$1}'` ## - Print Summary Line ## - _strlen=${#_overall_usage} _count_blank=`expr $right_tabstop + $_strlen` _str_blanks="" _outstring="\t" while [ $_count_blank -gt 0 ]; do _str_blanks="${_str_blanks}. " _count_blank=`expr $_count_blank - 1` _outstring="${_outstring}=" done outnl "" outnl "$_outstring" ## - Print Summary ## - _strlen=${#base_dir} _count_blank=`expr $right_tabstop - $_strlen` _str_blanks="" while [ $_count_blank -gt 0 ]; do _str_blanks="${_str_blanks} " _count_blank=`expr $_count_blank - 1` done _outstring="\t${base_dir}${_str_blanks}${_overall_usage}" outnl "$_outstring" fi outnl exit 0