PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl - Dir rekursiv ausgeben



tecker2010
30-11-2007, 10:32
Hallo,

mein Wunsch ist der folgende. Ich habe ein Verzeichnis, welches ich rekursiv ausgeben möchte. Das bekomme ich noch hin. Nun möchte ich zusätzlich von jedem Unterverzeichnis (es sind nur 2 Ebenen) den Verzeichnisnamen in eine Variable speichern. Hintergrund ist der, dass sich in jedem Unterverzeichnis eine Anzahl an HTML Dateien befinden. Diese möchte ich alle nach einandner öffnen und dort alle Zeilen entfernen die den Namen des Unterverzeichnisses (in dem ich mich gerade befinde) löschen.

Klingt vielleicht ein wenig verwirrend. Evtl. jmd. ein Idee??

Viele Grüße

craano
30-11-2007, 18:37
Verzeichnisse mit Perl Mitteln rekursiv abgrasen ist nicht so ganz ohne.
Schau Dir dazu mal das hier an:
http://de.selfhtml.org/perl/sprache/schleifen.htm#rekursion

Falls Deine Scripte auf einem Linux / Unix Rechner laufen, steht dir mit >find< ein sehr mächtiges Werkzeug zur Verfügung.

Mit

@dir = qx(find ./ -type d -maxdepth 2);
kannst Du die Verzeichnisnamen sehr performant ermitteln.

Grüße.
craano.

jan61
03-12-2007, 20:35
Moin,

so schwer ist es in Perl nicht, Verzeichnisse durchzuflöhen:


use strict;
use warnings;
no warnings "recursion"; # bei tieferen Verzeichnisstrukturen sinnvoll

sub read_dir {
my ($dir, $d_ref) = @_; # Verzeichnis + Referenz auf Namens-Hash
# Verzeichnis oeffnen, lesen, schliessen
opendir DIR, $dir or die $!;
my @dlist = readdir DIR;
closedir DIR;
# Hash-Eintrag fuer aktuelles Verzeichnis erzeugen
my @flist = (); # das Array mit den Dateinamen
$d_ref->{$dir} = \@flist; # Adresse des Arrays im Hash speichern
# Verzeichnis-Eintraege durchgehen
foreach my $d (@dlist) {
next if $d =~ /^\.{1,2}$/; # . und .. ueberspringen
my $dpath = $dir . "/" . $d;
if (-d $dpath) {
read_dir($dpath, $d_ref); # Funktion rekursiv mit Subdir aufrufen
}
elsif (-f $dpath) {
push @flist, $d; # Dateinamen merken im Array fuer akt. Verzeichnis
}
}
}
my %dirlist = ();
read_dir "/pfad/zum/basis/verzeichnis", \%dirlist;

# Auswerten:
foreach my $dname (keys %dirlist) {
my $f_ref = $dirlist{$dname}; # Referenz auf Datei-Array
print "Verzeichnis: ", $dname, "\n";
foreach my $fname (@$f_ref) {
print "\t", $fname, "\n";
}
}
exit 0;
Jan

reneeb
03-12-2007, 23:26
Man könnte auch File::Find nehmen ;-)