Programm zur Semigrafischen Darstellung der Directory-Baumstruktur

F

Faceried

Guten Tag =)

Ich such seit Tagen für die folgende Aufgaben, die wir an der FH lösen sollen eine Lösung. Da keiner meiner Komilitonen eine Ahnung hat bzw kein wirkliches Wissen über Unix/Shell besitzt um diese Aufgabe zulösen frage ich(wir) euch nach Ansätzen um diese Aufgabe zulösen. Viel lieber wär mir(uns) eine komplett Lösung(die nicjht zu 100% richtig sein muss).

:hilfe2:

Hier die Aufgabe:

Es soll ein Shell-Programm entwickelt werden, das beim Aufruf die Baumstruktur des angegebenen Directories ausgibt. (ähnlich, wie das DOS-Kommando "tree")

Name des Programms: baum

Aufruf: baum [pfad]
a) ohne Parameter:
Ausgangspunkt ist das aktuelle Directory
b) mit Parameter "pfad":
Ausgangspunkt ist das durch "pfad" definierte Directory

Beispiel:
$baum $HOME
/home/unix1010 (* Ausgangs-Directory *)
|--team1 (* Ebene 1 *)
| |-- spezi (* Ebene 2 *)
| |-- java
| | |--lbis (* Ebene 3 *)
| | |--exe
| |--cpp
| |--c_prog
| | |--lbis
| | |--exe
| | | |-old (* Ebene 4 *)
|--team2
| |
usw.

Hinweise
- Die Aufgabe kann z.B. durch rekursiven Aufruf eines Unterprogramms oder durch Anwendung des Kommandos ls -R gelöst werden.
- Mit Hilfen des Kommandos cut können einzelne Teile aus einer Zeile entnommen werden.
- Die in dem Beispiel enthaltenen Kommantare (*...*) werden nicht ausgegeben.

Zudem dürfen wir nur Unix-Standardbefehle benutzen und auch keine eigenen in C programmieren. Die Programme find und set dürfen wir auch nicht benutzen. Eingabefehler sollen auch noch so wiet wie möglich abgefangen werden =P

Wir würden uns über jede Hilfe freuen. :))
 
du hast die lösung doch schon in der aufgabenstellung stehen.
ls -R als rekursion und baust das teil einfach auf ... danach kommt immer eine abfrage ob es sich um eine Dir oder was anderes handelt.
Bei einer Dir gehste in die nächste ebene bei etwas anderem (link, file) hängste ein blatt an

wie das programmiertechnisch geht, kannst du sehr schnell erlernen. Ich denke nicht das hier jmd dir eine komplettlösung vorsetzt.

greetz
 
> ... Aufgaben ... FH
Frage mal höflich die Linuxadmins in der FH, die kennen nämlich das Prog. tree auch unter Linux

Code:
# man tree
NAME
       tree - list contents of directories in a tree-like format.

SYNOPSIS
       tree  [-adfgilnopqrstuxACDFNS]  [-L  level  [-R]]  [-H  baseHREF]  [-T  title]  [-o filename] [--nolinks] [-P pattern] [-I pattern] [--inodes]
       [--device] [--noreport] [--dirsfirst] [--version] [--help] [directory ...]
 
Ja aber es soll ja selber programmiert werden. Und außerdem c verboten. (Ich schätze mal einfach, dass tree ein c-Programm ist.)

Hier ein paar Hints für die Aufgabe:
Code:
ls -1d */
Gibt die Verzeichnisse im aktuellen Verzeichnis aus. (*/ ist ein glob auf Verzeichnisse und -d sagt ls "nur Verzeichnisnamen, nicht den Inhalt ausgeben". Die "-1" Option sorgt dafür, dass pro Zeile nur ein Verzeichnis angezeigt wird.)

Mit einer while-read Kombination kann man dann schon über die Verzeichnisse iterieren:
Code:
ls -d1 */ | while read dir; do echo "current dir: $dir"; done

Der Skriptname ist in der Variablen "$0" enthalten, die Parameter zum Skript in den Variablen $1, $2, ... $n. Damit kann man das Programm rekursiv machen. (Vielleicht ein kleines Wrapper-Skript um das dann *rein* rekursive Skript? kA, eure Entscheidung.)
Code:
#!/bin/sh

if [ x"$1" = x"ENOUGH" ]; then
    echo "ok then"
    exit
else
    echo not enough, hm?
    echo parameters were: "$@"
fi

$0 ENOUGH

Um zu testen ob ein Verzeichnis ein Link ist, benutze man die "-L" Option von test. Lektüre:
Code:
man test
Und ja, auf Links sollte man testen. Schließlich können diese auf höherliegende Verzeichnisse verweisen und dadurch Endlosschleifen produzieren. (Wenn du nicht grade jede bereits besuchte Position explizit speicherst; wäre mir aber viel zu viel Arbeit.)
Btw, "man test" hilft der auch bei "Eingabefehler sollten abgefängen werden", nur so als Hinweis.

Oh, und falls es noch nicht bekannt ist: mit "cd" wechselt man das Verzeichnis.

So, sollten imho genug Hilfen sein.
 
Ich habe die Aufgabe ohne ls -R gelöst. ;)
Wenn ihr also eure Lösung *vergleichen* wollt, schaut euch meine an.
Bitte kopiert nicht einfach, ihr sollt ja auch etwas lernen. :)

MfG,

Tblue
 
Tblue: Deine for-Schleife funktioniert nicht bei Datei-/Verzeichnisnamen mit Leerzeichen.
Code:
IFS=$'\n'
Würde helfen (ist allerdings n bash feature, der interpolated string, bei sh müsstest du dann "explizit" sein), aber da ist ne while-read Kombi imho "sauberer".
 
Zuletzt bearbeitet:

Ähnliche Themen

Programm zur Semigrafischen Darstellung der Directory-Baumstruktur

Segmentation Fault bei strcat?

CGI laesst sich nicht ausfuehren

Zurück
Oben