#!/bin/ksh # ------------------------------------------------------------------------------ # tree [-h] [-d] [directory] # # Getestet auf : HP-UX 7.05 und SUNOS 4.1.1 # # Martin Zahn 20.10.91 # # Ausgabe eines Directories in Form eines grafischen Baumes mit der rekursiven # Funktion "tree_walk". Verbesserte Version, damit auch Hidden Directorys ver- # arbeitet werden. Auf UNIX-Rechnern, welche keine Hidden-Directories analog # HP9000 kennt sollte bei ls die Option "H" entfernt werden. # # Erlaubte Optionen : # # -h : HELP anzeigen # -d : Nur Directories sollen angezeigt werden # # Der Directory-Baum wird mit folgenden Zeichen versehen : # # file* : Executable File # directory/ : Directory # directory/- : Leeres Directory # file@ : Symbolic Link # directory+ : Hidden Directory (CDF) # # Ist ein Directory nicht lesbar, so ertoent ein # Warnton und das Directory wird gekennzeichnet : # directory/ <-- directory not readable ! # ------------------------------------------------------------------------------- # Globale Variablen PATH=/bin:/usr/bin:/etc typeset integer DIRECTORY_ONLY=0 # Rekursive Funktion zur Ausgabe des Dateibaumes function tree_walk { dir=$1 # # Kontrolle ob Directory lesbar ist : "dr--r--r--" # Wenn Ja : Change Directory und Inhalt ausgeben # Wenn Nein : Abbrechen der rekusiven Funktion und in rufender Funktion # weiterfahren (Funktion = tree_walk) # [ -x $dir ] || { print - "\007 <-- directory not readable ! \c"; return; } cd $dir # # Keine Pathname Expansion durchfuehren, damit werden die speziellen # Zeichen generiert durch ls -F dargestellt. # ls -F : "/" --> Directory # "*" --> executable File # "@" --> Symbolic Link # ls -q : Nicht druckbare Zeichen wie zB. ESQ-Taste in einem Dateinamen # durch "?" darstellen. # ls -A : Alles ausgeben, ohne "." und ".." # set -f # # Belegen der Positional Parameter $1, $2, ...... mittels set # Mit der Variablen dummy wird verhindert, dass set nicht die Environment-Variablen # ausgibt, wenn das Directory leer ist. # Close stderr (2>&-), damit werden keine Fehlermeldungen angezeigt # set dummy `ls -AqFH 2>&-` || { print - "$0: illegal option for ls \c"; return; } # # "$1" beinhaltet nun "dummy", mittels shift werden die Parameter nach links # geshiftet. Damit sind die Positional Parameter richtig gesetzt. # shift # # Wenn das Directory leer ist, so wird nur ein "-" an den Directory-Namen # angehaengt und die rekursive Funktion wird sofort verlassen # [ $# = 0 ] && { print - "-\c"; return; } # # Baum rekursiv abarbeiten bis zu zweitletztem Eintrag # while [ "$2" ] # Ist zweitletzter Eintrag noch vorhanden ? do case $1 in # # Directory gefunden : Erneutes Aufrufen der Funktion tree_walk # Damit wird der Directory-Baum rekursiv abgearbeitet. # */ | *+) print - "\n${graph}|----$1\c" (graph="${graph}| "; tree_walk $1) ;; # # File gefunden : Ausgabe von "graph" welche die Grafik des # Directory-Baums enthaelt, gefolgt vom File. # *) [ $DIRECTORY_ONLY = 0 ] && { print - "\n${graph}|----$1\c"; } ;; esac # # Naechsten Eintrag bereitstellen $1 <-- $2 <-- $3 .... usw # shift done # # Letzten Eintrag auswerten # case $1 in # # Letzter Eintrag ist ein Directory : Erneutes Aufrufen der Funktion tree_walk # Damit wird der Inhalt dieses letzten Directories ausgegeben. # */ | *+) print - "\n${graph}\`----$1\c" # Abschluss Grafik graph="${graph} "; tree_walk $1 ;; # # Letzter Eintrag ist ein File : Ausgabe von "graph" gefolgt vom File # *) [ $DIRECTORY_ONLY = 0 ] && { print - "\n${graph}\`----$1\n${graph}\c"; } ;; esac } trap 'print -; exit' 0 2 3 # # Testen der erlaubten Optionen # set -- `getopt dh $*` if [ $? != 0 ] then print - Usage: tree [-h] [-d] [directory] exit 2 fi # # Optionen auswerten # for i in $* do case $i in # # Help anzeigen # -h) cat <<- EOF # cat <<- EOF > FILENAME schreibt Daten in file Directory Baum darstellen mit rekursiver Funktion ------------------------------------------------- Erlaubte Optionen : -h : HELP anzeigen -d : Nur Directories sollen angezeigt werden Der Directory-Baum wird mit folgenden Zeichen versehen : file* : Executable File directory/ : Directory directory/- : Leeres Directory file@ : Symbolic Link directory+ : Hidden Directory (CDF) Ist ein Directory nicht lesbar, so ertoent ein Warnton und das Directory wird gekennzeichnet : directory/ <-- directory not readable ! EOF break ;; # # Nur Directories anzeigen, ohne deren Inhalte # -d) shift DIRECTORY_ONLY=1 ;; # # Gesamten Baum ausgeben, Directories und deren Files # --) # # Setzen von dir to $1 if set, else to `pwd` # shift dir=${1:-`pwd`} # # check if $dir is a directory # [ -d $dir ] || { print - $0: bad directory $dir >&2; exit 1; } print - "`basename $dir 2>&-`/\c" tree_walk $dir break;; esac done