Rekursiv durch den Verzeichnisbaum + Dateiauswahl

Z

zielscheibe

Mitglied
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 !?
 
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
 
Wolfgang_1 schrieb:
Hallo Wolfgang

Verstehe deine Frage nicht recht.
Was bitte ist das VORLETZTE Verzeichnis?
Angenommen ein Verzeichnis hat 4 Unterverzeichnisse. Dann ist
das 4. das Letze. Ich will aber ins dritte, also das Verzeichnis
vor dem Letzten.

Wenn du damit meinst, in welcher reihenfolge das der
Befehl find per default ausgibt, dann sollte dir folgendes den vorletzten Eintrag liefern:

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

Wo und wie meinst du ein html-document anzeigen zu wollen?
Webseite auf einem internen Apache-Server (habe root Rechte).

Welche Scriptsprache verwendest du für die CGI Schnittstelle?
/bin/bash :)

Wer ruft das SKript von wo auf, und wohin soll die Ausgabe erfolgen?
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.
 
Zuletzt bearbeitet:
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. ;)
 
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";
 

Ähnliche Themen

Problem mit Rekursion in Bash / Funktioniert das überhaupt?

Shellskript soll Verzeichnisse rekursiv 'abarbeiten'

Von Streamingserver angelegte Dateien umbenennen + in Verzeichnisse einordnen

zip Dateien in Unterordnern entzippen

Server-Monitoring mit RRDTool

Zurück
Oben