Terminal Befehl ähnlich TREE (DOS)

I

IceCold

Hallo,
ich möchte gerne eine strukturierte Verzeichnisstruktur eines Ordners auf meiner externen Festplatte erstellen.
Dabei sollte das oberste Verzeichnis (Ebene 1) am Anfang dargestellt werden, darunter dann das 1. Unterverzeichnis (Ebene 2), darunter dann direkt alle Dateien (Ebene 3), die sich darin befinden. Erst unterhalb der Dateien soll dann das 2. Unterverzeichnis (Ebene 2) angezeigt werden.
Unter Windows funktioniert das prima mit dem Tree Befehl.
Bei Mac OS X kenn ich allerdings nur den Befehl "ls", und da werden zuerst alle Unterverzeichnisse (Ebene 2) aufgelistet, und erst darunter dann die Inhalte der einzelnen Unterverzeichnisse.

Ich hoffe mal, ich konnte mich verständlich ausdrücken.
Das ganze soll dann per >file.txt in eine Datein geschrieben werden (die Ergänzung ist zum Glück identisch mit Windows ;)).
 
So richtig hab ich jetzt zwar nicht verstanden was der Tree Befehl macht, aber meinst du vielleicht


ls -R


?
 
Also das mit dem lstree schaut schon mal gut aus.
Leider hab ich (noch) überhaupt keine Ahnung, was ich mit so einem Skript anstellen muss, bzw wie man das installiert oder was auch immer. Bin eben noch ein Newbie.
 
erzeuge einfach eine ausführbare datei und lege diese dann in /usr/bin ab. jetzt kannst du lsthree als befehl benutzen

ist dies bei euch auch so es ist egal was man für einen pfad angibt die ausgabe bekommt man immer vom aktuellen verzeichniss

KoppC@remoteadmin:/Volumes/Daten$lsthree /Users/KoppC/Downloads/
/Users/KoppC/Downloads/ (ist nur der pfad)
|..Bestellschein (die ausgabe ist von meiner Datenplatte)
|----Bilder
|----Schriften
 
Zuletzt bearbeitet:
KoppC schrieb:
erzeuge einfach eine ausführbare datei und lege diese dann in /usr/bin ab. jetzt kannst du lsthree als befehl benutzen

Genau, den lstree.txt script (z.bsp. im attachement des postings) downloaden
-mv lstree.txt lstree.sh
-chmod +x lstree.sh oder chmod 755 lstree.sh
-ausführen mit ./lstree /usr oder ./lstree /home oder eben den script in einem bin-directory platzieren.
-ich habe bei mir noch ein symlink gemacht, sodass ich lstree.sh durch lstree aufrufen kann: ln -s /bin/lstree.sh /bin/lstree

Gruss
Marc
 

Anhänge

  • lstree.txt
    715 Bytes · Aufrufe: 75
Zuletzt bearbeitet:
Vielen Dank für die Hilfe,
mit sudo hats dann endlich geklappt, vorher erhielt ich immer Permission denied.

Das Skript ist zwar nicht ganz so schön wie der Tree Befehl, aber es erfüllt seinen Zweck.


Beispiel einer Tree Ausgabe:
Code:
D:.
|   AUTHORS.txt
|   vlc.exe
|   
+---http
|   |   index.html
|   |   
|   +---admin
|   |       browse.html
|   |       
|   \---vlm
|           edit.html
|           
+---locale
|   +---da
|   |   \---LC_MESSAGES
|   |           vlc.mo
|   |           
|   +---de
|   |   \---LC_MESSAGES
|   |           vlc.mo



EDIT:
Wollte den Befehl gerade über Netzwerk anwenden (über eine Samba Freigabe eines Win XP Rechners).
Da erstellt er mir immer wieder eine neue Zeile, sobald eine Leerzeichen im Dateinamen vorkommt.
"Dies ist der Dateiname.txt" schaut dann so aus:
---Dies
---ist
---der
---Dateiname.txt*
 
Zuletzt bearbeitet von einem Moderator:
IceCold schrieb:
"Dies ist der Dateiname.txt" schaut dann so aus:
---Dies
---ist
---der
---Dateiname.txt*

For .. in `ls` ruft ls auf und geht alle Elemente der Liste die ls ausgibt durch. Liste? Das gibt doch Text aus? Genau, und wenn man den als Liste behandelt sagt die Shell, die einzelnen Elemente sind durch Whitespace getrennt. Deshalb funktionieren fast alle dieser Scripte damit nicht. (Es gibt natürlich Alternativen zu `ls`, aber irgendwie denkt da keiner dran.)

Hier ist zur Abwechslung mal etwas Spaghetti-C:

Code:
#include <stdio.h>
#include <sys/types.h>
#include <fts.h>

int main(int argc, char **argv) {
        FTS *fts;
        FTSENT *e;
        int i;

        if(argc < 2) return 0;
        fts = fts_open(argv+1, FTS_COMFOLLOW|FTS_NOSTAT|FTS_PHYSICAL, NULL);
        while((e = fts_read(fts))) {
                if(e->fts_number) continue;
                if(e->fts_info == FTS_D && e->fts_level > 0) for(i=e->fts_level; i>0; --i) printf(i>1?"|   ":"|   \n");
                for(i=e->fts_level - (e->fts_info == FTS_D); i>0; --i) printf("|   ");
                if(e->fts_info == FTS_D && e->fts_level > 0) printf("+---");
                puts(e->fts_name);
                e->fts_number = 1;
        }
        fts_close(fts);
        return 0;
}

Das selbe in compiliert. (Rechte setzen nicht vergessen.)

Aufruf:

Code:
$ ./fstree /tmp
tmp
|  
+---.KerberosLogin-501-5879536 (inited,gui,tty,local)
|   |   KLLCCache.lock
|  
+---501
|   cs_cache_lock_92
|  
+---uscreens
|   |  
|   +---S-df
|   |   |   249.ttyp1.dhcp202
 
ich hab versucht, die Skripte zu installieren, hab es jedoch bei keinem geschafft. Gibt es nicht den ganz einfachen und essentiellen Unix-Befehl "tree" bzw kann man den nachträglich irgendwie installieren? ich hab gelesen, dass der nicht immer bei allen Linux Distributionen dabei ist und man den daher manchmal nachinstallieren muss, jedoch hab ich nicht herausbekommen können, wo.

EDIT: hab es jetzt doch geschafft, das c-skript zu installieren, war noch nicht universal. Aber ich bleibe dabei, dass ich lieber den Unix-Befehl tree hätte, der ist ein bisschen angenehmer
 
Zuletzt bearbeitet:
Zurück
Oben Unten