Datei Information Script Erweitert
Script vom 25.03.2009
Free Beer/Juice gibt es für:
- Den Bug im Link-Teil beheben
- Padding mit Leerzeichen
Neue Variante wo der Script gewaltsam zusammenkürzt wurde. Lesbarkeit ist nur für Warmduscher
- Die Redundanzen finden und beheben
- für jeden der es sich von Anfang bis Ende durchzieht
#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