# return an arbitrary directory path suffix # usage: dir_suffix num_of_path_elements [optional prefix] function dir_suffix() { num=${1:-1}; prefix=${2:-".../"} cd=$(pwd) arr=( $(echo $cd | tr '/' ' ') ); ret=""; len=${#arr[*]} if [ $len -le $num ]; then echo $cd else for i in $(seq $len -1 $(expr $len - $num)); do ret="${arr[$i]}/$ret"; done; ret_len=${#ret} echo "${prefix}${ret:0:$(expr $ret_len - 2)}"; fi } # return an abbreviated version of a path # usage: abbr_path num_of_path_to_show [optional path] # abbr 2 /foo/bar/baz # /f/bar/baz function abbr_path() { path=${2:-$(pwd)} num=${1:-2} ret="" fc=${path:0:1} case $fc in "~") ret=$fc num=$(expr $num - 1) path=${path:1} ;; "/") ;; *) ret=$(expr $path : '^\([^\/]*\)\/') path=${path:${#ret}} ret=${ret:0:1} num=$(expr $num - 1) ;; esac arr=( $(echo $path | tr '[A-Z]' '[a-z]' | tr '/' ' ') ) len=${#arr[*]} if [ $len -le $num ]; then echo ${2:-$(pwd)} else if [ $num -gt 0 ]; then for i in $(seq 0 1 $(expr $len - $num - 1)); do el=${arr[$i]} el=${el:0:1} ret="$ret/$el" done fi for i in $(seq $(expr $len - $num) 1 $(expr $len - 1)); do el=${arr[$i]} ret="$ret/$el" done echo "$ret/"; fi }