Datei Information Script Erweitert

Script vom 25.03.2009

Free Beer/Juice gibt es für:


#Datei Info Script

# Informationen über Dateien anzeigen

# Parameter auswerten
# $1: Pfad zur Datei

# *** WICHTIG BITTE LESEN ***
# Im diesem Script gibt es 4 Funktionen,
# sie sind unterschiedlich komplex und
# unterschiedlich stark ausdokumentiert
# Am einfachsten ist AuswertungVerzeichnis,
# Danach kommt AuswertungDatei, welche viele Informationen und ungefähr
# den stand hat den wir alle jetzt haben sollten
# und zu guter letzt GetPadding und AuswertungLink
# die letzen beiden sind komplexer und sparlicher ausdokumentiert
# wenn du denkst das du alles was im Kurs dran kamm mehr oder weniger
# anwenden kannst, würde ein Blick in die beiden nicht schaden =)


# **Padding Funktion**
# Gibt ein Padding bestimmter Länge aus
# GetPadding Länge
# Parameter:
#    Länge  : Zahl  Die Länge des Paddings
# Returns:
#    Immer Wahr
#    erstelltes Padding nach sdout
GetPadding()
{
     if [ $# -gt 0 ]; then
         i=$1
     else
         i=0
     fi
     result=
     while [ $i -gt 0 ]; do
         result="${result}-|"
         i=$(($i - 1))
     done
     echo $result
}


# **Funktionen zur Auswertung unterschiedlicher Dateien**

# Alle Auswertungs-Funktionen haben den selben Aufbau
# func datei [padding]
# jede Auswertungs-Funktion muss die Datei die ausgewertet werden soll mit übergeben werden
# zusätzlich haben wir einen alternativen Parameter der es uns
# ermöglichen soll die Ausgabe einzurücken
# wenn ihr sehen wollt warum geht zu Zeile: [NRHIER]

# Gibt Eigenschaften eines Verzeichnisses aus
# AuswertungVerzeichnis Verzeichniss [Padding]
# Parameter:
#    Verzeichnis : Pfad   Pfad zum Verzeichnis
#    Padding     : Zahl   Wieweit die Ausgabe eingerückt werden soll
# Returns:
#    Immer Wahr
# Anmerkung:
#    Die Funktion überprüft die Parameter NICHT.
AuswertungVerzeichnis()
{
   # die Funktion ist zwei geteilt, zuerst ermitteln wir die Werte die wir benutzen wollen
   # und danach geben wir sie aus

   # dieser Befehl führt zuerst du -sch $1 um die aktuelle Verzeichnissgröße zu ermitteln
   # hier sind vorallem die Optionen c für "Gib das Totale aus" und h für "Menschenlesbar"
   # zu beachten.
   #
   # die Ausgabe von du -sch $1 wird nun zwei geteilt
   #    >2 /dev/null: Schicke alle möglichen Fehler ins Nirvana(/dev/null)
   #    | tail -1: von der regulären Ausgabe nimm nur die letzte Zeile
   #
   # von dieser letzten Zeile nehmen wir nun den ersten Teil,
   # was nicht nur rein zufällig der ganze Platzverbrauch des Verzeichnisses ist =)
   #
   # diese Ausgabe schreiben wir nun die die Variable size(Größe)
   # hierbei sind die `` von wichtiger Bedeutung
   size=`du -sch $1 2> /dev/null | tail -1 | cut -f1`

   # Als nächstes ermittlen wir den Inhalt des Verzeichnisses. das machen wir mit ls -l, grep und wc
   # da wir ls -l hier öfters brauchen werden, speichern wir die Ausgabe von ls -l in $ll zwischen
   # danach filtern wir mit grep nach unterschiedlichen Dateien
   # und zählen danach die Ausgabe zeilenweise mit wc -l.
   # Da ls -l immer eine Datei pro Zeile ausgibt. Funktioniert das auch ganz prächtig

   # hier kommt 4 mal das gleiche jeweils ein wenig anders
   # Zuerst lassen wir uns den ordner von ls- l anzeigen,
   # danach filtern wir die Ausgabe mit grep.
   # Und zwar filtern wir nach dem ersten Zeichen:
   #  - heißt es ist eine Datei
   #  d heißt es ist ein Verzeichnis( Directory )
   #  l heißt es ist ein Symbolischer Link ( Link )
   # was nach dem Filtern übrig ist wird von wc -l gezählt
   # auch hier wieder die `` damit wir in die Ausgabe
   # in eine Variable bekommen
   # sum(summe)

   sumTotal=`ls -l $1 | wc -l`
   sumDatei=`ls -l $1 | grep "^-" | wc -l`
   sumVerzeichnis=`ls -l $1 | grep "^d" | wc -l`
   sumLink=`ls -l $1 | grep "^l" | wc -l`

   # sumTotal ist eine Ausname, da die erste Zeile von ls -l
   # keine Datei enthällt müssen wir sumTotal um 1 reduzieren
   # was  wir hier machen ist recht simpel,
   # wir verwenden ein feature der Bash
   # $(( rechnung )) erlaubt es in der bash zu rechnen
   # also rechnen wir $sumTotal -1 und speichern das wieder in $sumTotal
   sumTotal=$(($sumTotal - 1))

   # Es ist Zeit unsere Ergebnisse auszugeben
   # Wenn es nicht klar ist was padding=`GetPadding $2` und ${padding} macht,
   # ignoriert es einfach, ich gehe weiter unten darauf ein
   padding=`GetPadding $2`
   echo ${padding}Total: $sumTotal
   echo ${padding}Verzeichnisse: $sumVerzeichnis
   echo ${passing}Dateien: $sumDatei
   echo ${padding}Links: $sumLink
}


# Gibt Eigenschaften einer regulären Datei aus
# AuswertungDatei Datei [Padding]
# Parameter:
#    Datei   : Pfad   Pfad zur Datei
#    Padding : Zahl   Wieviel eingerückt werden soll
# Returns:
#    Immer Wahr
# Amerkungen:
#     Parameter werden NICHT überprüft
AuswertungDatei()
{
    # Die Funktion wird die Größe der Datei, wem sie gehört
    # und ob wir sie lesen- schreiben- ausführen-dürfen
    # sowie ihren typ ausgeben.
    # Hierfür wird sie wie AuswertungVerzeichnis zwei geteilt.
    # Als erstes sammeln wir die Informationen
    # und danach geben wir sie aus

    # Da wir wieder viel von ls -l gebrauch machen
    # speichern wir ls -l zwischen
    # als eine weitere Option werden wir aber noch
    # h für humanreadable( menschenlesbar ) angeben
    # damit die Größenangabe besser aussieht
    ll=`ls -lh $1`

    # an 5ter Stelle der Ausgabe von ls -lh steht die Dateigröße.
    # Also schneiden wir doch die 5Stelle mal aus und packen sie
    # in die Variable size
    # Dafür benutzten wir cut
    # damit das ganze aus geht müssen 2 Optionen angeben werden
    # -d" " gib den Deliminiter (Trennzeichen) an
    # damit wird angeben wo cut schneidet
    # mit -f5 sagen wir das es das fünfte Schnipsel ausgeben soll
    size=`echo $ll | cut -d" " -f5`

    # In linux gehöhrt alles einem Benutzer und einer Gruppe
    # Dateien sind da keine Ausnahme
    # finden tun wir das an der 3 und 4 Stelle in ls -lh
    # Um also die Werte zu bekommen machen wir das
    # gleiche wie für die Größe, nur für Schnippsel 3 und 4
    # und packen das in owner(Besitzer) und group(Gruppe)
    owner=`echo $ll | cut -d" " -f3`
    group=`echo $ll | cut -d" " -f4`

    # Nun wollen herausfinden ob wir die Datei
    # lesen, schreiben, ausführen dürfen.
    # Dafür müssten man aber erstmal wissen wer wir sind
    # Gespeichert sind diese Informationen in $USER und $GROUPS
    # Jetzt ist es wichtig zu wissen, ob die Datei uns gehöhrt
    # ob sie in unsere Gruppe ist, oder hallt nicht.
    #
    # nachdem wir herausgefunden haben wer sir sind, können
    # wir unser ls -lh nehmen und uns die erste Spalte ansehen
    # das erste Zeichen sagt ja aus was für eine Datei
    # wir vor uns haben. Danach kommen die
    # Lese-Schreib- und Ausführbar-Rechte und zwar geordnet nach,
    # Benutzer Gruppe Andere. Jeweils 3 Zeichen,
    # also insgesammt 9 Zeichen
    # wir schreiben die für uns passenden 3 in $rwx und werten die
    # später aus
    #
    # das auslesen für §rwx machen wir so:
    # rwx=`echo $ll | cut -c=N-M`
    # damit schneiden wir die Buchstaben an der Stelle N bis zur Stelle M aus und schreiben sie nach rwx

    # Sind wir der Besitzer?
    if [ $USER == $owner ]; then
        rwx=`echo $ll | cut -c2-4`
    else
        # Gruppe ist entwas schwieriger.
        # Den wir können mehrere Gruppen angehöhren
        # Und $GROUPS enhällt diese Gruppen als Nummern.
        # Wir haben aber unsere Gruppe als Namen
        # Daher müssen wir erst die Nummer für die Gruppe der Datei finden
        # Und danach in Groups danach suchen

        # In /etc/group steht an erster stelle der name der gruppen
        # und an dritter ihre Nummer
        # also suchen wir unsere Gruppe mit grep und
        # schneiden danach mit cut die Nummer aus
        # als variable zum speichern nehmen ich idGroup
        # grep und cut wurden zu genüge weiter oben besprochen
        # daher erspar ich mir das hier
        idGroup=`grep -i "^${group}" /etc/group | cut -d":" -f3`

        # jetzt noch ein weiteres grep um heraus zufinden ob
        # wir in der Gruppe sind. Hierbei ist wichtig zu
        # wissen das Grep Wahr zurück gibt wenn Grep was findet,
        # ansonsten halt Unwahr. D.h. wir können grep in ifs benutzen =)
        # Diese Zeile lesen wir also: Wenn $idGroup in $GROUPS vorkommt.
        # die option -q sagt grep das es quiet (leise) sein soll
        if echo $GROUPS | grep -q $idGroup; then
            # wir sind also in der gruppe
            rwx=`echo $ll | cut -c5-7`
        else
            # wir sind also jemmand anders
            rwx=`echo $ll | cut -c8-10`
        fi
    fi
    # Da wir nun in $rwx unsere Zugriffsrechte haben, werten wir sie mal aus
    # das machen wir wieder mit grep
    # und zwar verwenden wir wieder grep
    # wie wir es schon bei den Gruppen gemacht haben
    # Nur diesmal verwenden wir zusätzlich &&
    # befehl1 && befehl2
    # befehl2 wird nur dann ausgeführt wenn befehl1 war ist

    # wenn $rwx ein r enthällt ist die Datei lesbar also setzen wir readable( lesbar ) auf 0 ( Wahr )
    # ansonsten auf 1 ( Unwahr/Falsch )
    echo $rwx | grep -q r && readable=0 || readable=1
    # wenn $rwx ein w enthällt ist die Datei schreibbar also setzen wir writable ( schreibbar ) auf 0 ( Wahr )
    # ansonsten auf 1 ( Unwahr/Falsch )
    echo $rwx | grep -q w && writable=0 || writable=1
    # wenn $rwx ein x enthällt ist die Datei ausführbar also setzen wir executable ( ausführbar ) auf ( Wahr )
    # ansonsten auf 1 ( Unwahr/Falsch )
    echo $rwx | grep -q x && executable=0 || executable=1

    # zu guter letzt noch vom welchem typ die datei ist
    # dafür benutzen wir file, mit der option -b
    # damit der dateiname nicht mit wieder ausgegeben wird
    # das ganze geht nach filetype( Dateityp )

    filetype=`file -b $1`

    # *** wir sind fertig !!! ***
    # jetzt noch ausgeben

    # Wenn es nicht klar ist was padding=`GetPadding $2` und ${padding} macht,
    # ignoriert es einfach, ich gehe weiter unten darauf ein
    padding=`GetPadding $2`
    echo ${padding}Größe    : $size
    echo ${padding}Besitzer : $owner
    echo ${padding}Gruppe   : $group
    # ich möchte jetzt lesbar schreibar und ausführbar
    # in eine Zeile schreiben, dafür muß ich ein wenig
    # vorbereiten. Die Ausgabe schreibe ich in $dummy
    # Anmerkung:
      # dummy ist ein platzhalter für alles mögliche
      # wenn euch kein name einfällt und er es eh unwichtig
      # nehmt einfach dummy =)
    #sicherstellen das dummy leer ist
    dummy=
    # wenn readable gleich 0 ( wahr ) ist. füge ", Lesbar" an Ende von $dummy an
    [ $readable -eq 0 ] && dummy="${dummy}, Lesen"
    # selbe in Grün
    [ $writable -eq 0 ] && dummy="${dummy}, Schreiben"
    # selbe in Blau
    [ $executable -eq 0 ] && dummy="${dummy}, Ausführen"
    # wenn dummy nicht leer ist
    if [ -n dummy ]; then
        # Wer aufgepasst hat weiß das $dummy ein , zuviel an Anfang hat !
        # Wer das noch nicht wusste schaut jetzt schnell nach
        # das schneiden wir nun mit cut ab =)
        dummy=`echo $dummy | cut -c2-`
        # und nun das ganze Ausgeben:
        echo ${padding}Rechte   : $dummy
    fi
    # zu guter letzt der Typ
    echo ${padding}Typ      : $filetype
}

# Gibt Eigenschaften eines Softlinks aus
# AuswertungLink Link [Padding]
# Parameter:
#    Link    : Pfad   Pfad zur Link
#    Padding : Zahl   Wieviel eingerückt werden soll
# Returns:
#    Immer Wahr
# Amerkungen:
#     Parameter werden NICHT überprüft
AuswertungLink()
{
    # SoftLinks sind ein wenig Tricky
    # Da sie alles verlinken können
    # Dateien, Verzeichnisse alles möglich
    # ich möchte aber den Link komplett auflösen

    # Ausgeben will ich wohin der Softlink geht,
    # und das solange auflösen, bis es kein Softlink
    # mehr ist

    # Dafür ist diese Funktion drei geteilt.
    # Im ersten Teil lösen wir den Link auf
    # Im zweiten Teil geben wir den Link aus
    # Im dritten Teil verarbeiten wohin der Link Zeigt

    # dafür benutzen wir mal wieder ls -l
    # der letze( 10te ) Teil der Ausgabe ist die Datei auf die der Link zeigt
    # da wir cut ja schon öfters behandelt haben
    # jetzt mit weniger kommentar
    linkto=`ls -l $1 | cut -d" " -f10`

    # Zeiter Teil
    # padding ist eine Funktion die eine Fülltest erzeugt damit wir
    # ihn vor unsere Eingabe packen können, dadurch rücken wir ihn ein
    padding=`GetPadding $2`
    echo "${padding}$1 -> $linkto"

    # dritter Teil

    # wir nehmen das erste Zeichen
    # der Ausgabe von ls -l $linkto
    # und schmeißen das in ein case
    # da das erste Zeichen den Typ
    # können wir jetzt durchtesten
    case `ls -l $linkto | grep -o "^."` in
        "-")
            # Ist eine Datei
            AuswertungDatei $linkto $(($linkto $2 + 1))
            ;;
        "d")
            # Ist ein Verzeichnis
            AuswertungVerzeichnis $linkto $(($linkto $2 + 1))
            ;;
        "s")
            # Ist ein Symbolischer Link
            AuswertungLink $linkto $(($linkto $2 + 1))
            ;;
        "*")
            #Keins von den da oben
            echo ${padding}Unbekannt =\(
            ;;
     esac
}


# hat unser Script ein Parameter bekommen
# und ist dieser gültig ?
if [ $# -gt 0 ] && [ -e $1 ]; then
    datei=$1
    # Dateinfo ermitteln und anzeigen
    file $datei

    if [ -d $datei ]; then # Verzeichniss
        echo "$datei ist ein Verzeichniss"
        # ruf die Funktion  AuswertungVerzeichnis auf, mit dem Parameter $datei, wir geben kein padding an
        AuswertungVerzeichnis $datei
    elif [ -h $datei ]; then # Link
        echo "$datei ist ein Softlink"
         AuswertungLink $datei
    elif [ -f $datei ]; then # Datei
        echo "$datei" ist eine Datei
        # ruf die Funktion AuswertungDatei auf, die mit dem Parameter $datei aufgerufen wird
        AuswertungDatei $datei
    else
      echo "$datei ist was anderes ..."
    fi
else
    # Nicht gefunden
    echo "Datei \"$1\" nicht gefunden"
fi

LinuxKurs2009/Scripts/DateiInfoExt (zuletzt geändert am 2009-03-25 16:19:42 durch e179002079)