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