Rekursiv durch den Verzeichnisbaum + Dateiauswahl

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von zielscheibe, 31.10.2005.

  1. #1 zielscheibe, 31.10.2005
    zielscheibe

    zielscheibe Mitglied

    Dabei seit:
    31.10.2005
    Beiträge:
    28
    Zustimmungen:
    0
    Hallo NG!

    Ich suche eine Möglichkeit, rekursiv einen Verzeichnisbaum zu durchlaufen.
    Die Anzahl der Unterverzeichnisse ist nicht immer gleich. Ich möchte
    dann im VORletzen Verzeichnis eine HTML Datei anzeigen.
    (Das ganze kommt in ein cgi-Skript, der Syntax des html ist nicht das Problem)
    Andere Dateien im Verzeichnis sollen nicht angezeigt werden.

    Der Algo. wäre dann:
    Liste Verzeichnis->Ist vorletztes Verzeichnis? ->
    JA-> Zeige hmtl Datei
    Nein-> Wiederaufruf (Rekursion)

    Mit:
    ls -l -p | grep "/$"
    kann man sich nur Verzeichnisse anzeigen lassen, wahrscheinlich
    würde es aber besser mit find gehen !?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 31.10.2005
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Verstehe deine Frage nicht recht.
    Was bitte ist das VORLETZTE Verzeichnis?
    Wenn du damit meinst, in welcher reihenfolge das der
    Befehl find per default ausgibt, dann sollte dir folgendes den vorletzten Eintrag liefern:

    find --version
    GNU find Version 4.1.20


    A=($(find . -type d));echo ${A[$((${#A[*]} -2))]}
    Aber ob das nun das wirklich vorletzte ist, hängt von der Betrachtungsweise ab.

    Wo und wie meinst du ein html-document anzeigen zu wollen?
    Welche Scriptsprache verwendest du für die CGI Schnittstelle?
    Wer ruft das SKript von wo auf, und wohin soll die Ausgabe erfolgen?

    Du siehst, es ist sind viele Fragen offen.

    Gruß Wolfgang
     
  4. #3 zielscheibe, 02.11.2005
    Zuletzt bearbeitet: 02.11.2005
    zielscheibe

    zielscheibe Mitglied

    Dabei seit:
    31.10.2005
    Beiträge:
    28
    Zustimmungen:
    0
    Hallo Wolfgang

    Angenommen ein Verzeichnis hat 4 Unterverzeichnisse. Dann ist
    das 4. das Letze. Ich will aber ins dritte, also das Verzeichnis
    vor dem Letzten.

    Werde ich gleich mal testen.

    Webseite auf einem internen Apache-Server (habe root Rechte).

    /bin/bash :)

    Sobald ich die Seite aufrufe, soll das Skript gestartet werden und mir
    die Ausgabe zum Browser schicken. Das Skript liegt in /var/www/cgi-bin/

    Vielleicht sollte ich einfach mal noch kurz erklären was ich überhaupt machen möchte:
    Ich habe mit mrtg eine Übersicht über ein paar hundert Netzelemente gemacht. Jetzt will ich da eine Struktur reinbringen. z.b. /welt/europa/deutschland/netzelement1. Im vorletzen Verzeichnis, also hier dann /deutschland/ ist eine .html Datei, die Informationen unter /netzelement1 aufbereitet und sauber darstellt. /deutschland hat also mehrere Unterverzeichnisse, deren Inhalt mich aber nicht interessiert. Ich will jetzt durch diesen Baum durch navigieren. Es sollen aber nicht alle Dateien angezeigt werden, sondern nur die html Dateien im vorletzten Verzeichnis. Ich will im Endeffekt einen Baum darstellen. Die Verzeichnisse sind die Äste und die .html Seiten die Blätter.
     
  5. #4 Wolfgang, 03.11.2005
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Also suchst du simpel nach Verzeichnissen, die keinen weiteren Verzeichniseintrag mehr haben, und davon dann das Parent directory.

    So ganz plump würde ich mir da die Eigenschaft von dirname zunutze machen.
    Code:
    for I in $(find /home/wolle/ -type d -printf "%p\n" 2>/dev/null); 
    do
    #in A erstmal alle type d also Ordner 
    A=($(find $I -type d \! \( -name "\." -o -name "\.\." \) 2>/dev/null));
    #darin wieder nach Ordner suchen
    #dabei . und .. weglassen
    
    if ! [ ${#A[*]} -gt 0 ]; then 
    echo -e "$I ist ein Endzweig \nParent:\n $(dirname $I)\n\n";
     fi;
     done
    
    Das ist auch nur ganz grob, du musst schon deine Ausgabe selbst modifizieren.( nach einer Htmldatei suchen und ausgeben etc.)

    Auch solltest du darauf achten, dass keine Lerzeichen in den Dateinamen vorkommen. Dann müsstest du mit -print0 |xargs -0 arbeiten.
    Die manpage zu xargs sagt dir mehr dazu.

    Hier ging es nur um das Prinzip.
    Hoffe es hilft ein wenig weiter.

    Gruß Wolfgang
    PS Mit perl würde ich das aber viel eleganter lösen. ;)
     
  6. #5 zielscheibe, 04.11.2005
    zielscheibe

    zielscheibe Mitglied

    Dabei seit:
    31.10.2005
    Beiträge:
    28
    Zustimmungen:
    0
    Hallo Wolfgang!

    Danke, für deine Bemühungen.
    Habe das Problem vor 2 Tagen etwas anders gelöst.
    Ich bin durch google auf folgende Seite getoßen:
    http://www-user.tu-chemnitz.de/~uro/perlgoodies
    Ich hab hier nur 2 kleine Änderungen vorgenommen.
    (Beachte nur .html Dateien und füge bei den Links den Namen ohne
    html Endung ein)
    Das Programm ist zwar in Perl gerschrieben und nicht dynamisch,
    erledigt aber seine Aufgabe tadelos, nachdem ich die Daten von der Ansicht getrennt habe.
    Ich habe also ein Verzeichnis in dem die anzuzeigenden Bilder unsortiert
    drin sind und ein extra Verzeichnis, welches nur aus Unterverzeichnissen
    und html Seite besteht. Diese ist meine Hierarchie.


    Code:
    #!/usr/bin/perl -w
    
    #########################################################
    #  Rekursives Durchlaufen eines Verzeichnisbaumes
    #  und Anlegen von HTML-Dateien mit Links zu den einzelnen
    #  Files / Dirs
    #  R. Unger 11/2001
    #########################################################
    
    use strict;
    use Cwd;
    
    my $htmlname  = "index.html";
    my $topdir    = "/home/mrtg/ansicht";
    
    ##############################################################################
    
    sub go_in
    {
       my $the_dir = $_[0];
       my $level   = $_[1];
    
       my $hier=cwd();
    
       # Ins Dir gehen
       chdir $the_dir;
    
       print "go_in:: Level: $level ... Scanning Dir: $the_dir \n";
    
       # HTML Seite erstellen
       open(AUS,">$htmlname") || die "Kann $htmlname nicht schreiben \n";
       print AUS "<html>\n";
       print AUS "<head>\n";
       print AUS "  <title>Teste nms2</title>\n";
       print AUS "</head>\n\n";
       print AUS "\n\n";
       print AUS "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>\n";
       print AUS "<TR>\n";
       print AUS "<TD WIDTH=476><IMG BORDER=0 SRC=\"/icons/mrtg_lang.jpg\" WIDTH=476 HEIGHT=25</A></TD> \n";
       print AUS "<TD WIDTH=111><IMG BORDER=0 SRC=\"/icons/vub.gif\" WIDTH=111 HEIGHT=65</A></TD> \n";
       print AUS "</TR>\n";
       print AUS "</TABLE>\n";
       print AUS "<hr>";
       print AUS "<font size=+2>\n";
       print AUS "<center><b>\n";
       print AUS "</font>\n";
       print AUS "</b></center>\n";
       print AUS "<center>\n";
    
       # Files holen
       my @the_files=glob "*";
    
       # Liste aller Verzeichnisse herausfiltern
       my @found_dirs=();
       for (my $i=0;$i<@the_files;$i++)
         {
         if (-d $the_files[$i] )
            {
            push(@found_dirs,$the_files[$i]);
            print "Found Dir: $the_files[$i]\n";
            }
         }
    
       # Sortieren der Fileliste (aber nicht case sensitive !)
       @the_files=sort {uc($a) cmp uc($b)} @the_files;
    
       # und alles ausser die Seite selbst in die Seite schreiben
       for (my $i=0;$i<@the_files;$i++)
         {
         if ($the_files[$i] eq $htmlname) { next;}
    
         print AUS "\n<p>\n";
    
         print AUS "<b>\n";
         if (-d $the_files[$i] )
            {
            print AUS "<a href=\"$the_files[$i]/$htmlname\">$the_files[$i] </a>\n";
            }
         else
           {
           if ( $the_files[$i] =~ m/(.+?)\.html/)
              {
              my $laenge=(length($the_files[$i]));
              my $newname = (substr($the_files[$i],0,$laenge-5));
              print AUS "<a href=\"$the_files[$i]\">$newname </a>\n";
              }
            }
         print AUS "</b>\n";
         }
       print AUS "</center>\n";
    
       # Zurueck ergibt nur Sinn, wenn ich nicht ganz oben bin
       if ( $level > 1)
         {
         print AUS "<center>\n";
         print AUS "\n<p>\n";
         print AUS "<hr>\n<a href=\"../$htmlname\"> Zur&uuml;ck</a>\n";
         print AUS "<hr>\n";
         print AUS "</center>\n";
         }
       else
         {
         print AUS "\n<p>\n";
         print AUS "<hr>\n";
         }
    
      print AUS "&nbsp;&nbsp;&nbsp;&nbsp;";
      print AUS "<b></i>\n\n";
    
      print AUS "\n\n</body>\n</html>\n\n";
      close (AUS);
    
      # Levelnummer hoch
      $level++;
    
      # und alle gefundenen Subdirs abklappern
      #for (my $i=0;$i<@found_dirs;$i++)   orginal
      for (my $i=0;$i<@found_dirs;$i++)
         {
         go_in($found_dirs[$i],$level);
         }
    
       # Wieder in richtige Verzeichnis gehen
       # sonst klettern wir naemlich nur abwaerts
       chdir $hier;
    
    }
    
    ###########################################################################################
    # Hauptprogramm
    
    print "Start \n";
    go_in($topdir,1);
    print "Done \n";
    
     
Thema:

Rekursiv durch den Verzeichnisbaum + Dateiauswahl

Die Seite wird geladen...

Rekursiv durch den Verzeichnisbaum + Dateiauswahl - Ähnliche Themen

  1. [bash] Verzeichnisse rekursiv durchlaufren?

    [bash] Verzeichnisse rekursiv durchlaufren?: Hallo zusammen, ich versuche mir zur Zeit mit ein paar (Bash)Scripts einen *sicheren* Backupscript zu schreiben. Dazu müsste ich ein Verzeichniss...
  2. Ordner rekursiv durchwandern

    Ordner rekursiv durchwandern: hallo leute, ichz stehe momentan ein bisschen auf dem schlauch,- dabei bin ich mir sicher dass ich das irgendwo schonmal verwendet und gelesen...
  3. ordner rekursiv durchsuchen und dateien löschen

    ordner rekursiv durchsuchen und dateien löschen: hallo wie kann ich denn einen ordner (und alle unterordner) nach einen bestimmten ordner durchsuchen und löschen? es geht darum dass wegn...
  4. Rekursiver Algorithmus mit Fibonacci Funktion (Fibo)

    Rekursiver Algorithmus mit Fibonacci Funktion (Fibo): Hallo zusammen, hat von Euch jemand eine Idee, für ein Shell Script mit einem Recrusiven Algorithmus mit einer Fibonacci Funktion? Ich will...
  5. Rekursives Auslesen über 2 Ebenen und Ausführen von mehreren Befehlen

    Rekursives Auslesen über 2 Ebenen und Ausführen von mehreren Befehlen: Hallo zusammen, mein Ziel ist das rekursive Auslesen von 2 Verzeichnisebenen und das ausführen von Befehlen auf den vorhandenen Dateien. Konkret...