Verzeichnisse rekursiv 'abgrasen'
Boris Hoeller
- perl
Liebe Perl Experten,
Alle *htm* Dateien in einem Verzeichnis nebst Unterverzeichnissen lassen sich unter UNIX wie folgt auffinden:
-- snip --
#!/bin/bash
for _datei in $(find . -name "*htm*");
do
echo " Ich fand $_datei "
done
-- snap --
Kennt jemand die entsprechenden Zeilen in bzw. für P.E.R.L. ?
Danke für Antworten.
bonngrüße
Boris
opendir (DIR, "$pfad");
@inhalt = readdir (DIR);
foreach $item (@inhalt)
{
if ($item =~ m/.htm/ig $item =~ m/.html/ig)
{
print "$item\n";
}
}
closedir DIR;
Sollte funktionieren wenn ich mich net irgendwo vertippt habe *g*.
HTH, Marko
Whoops, böser Fehler. Untenstehender Code checkt nur das im $pfad angegebene Verzeichnis. Für Unterverzeichnisse bräuchte man eine zusätzliche Sub, die aufgerufen wird, wenn chkdir($item) true ist, und die dann den HTML-Inhalt des Unterverzeichnisses auflistet (bzw. auf weitere Unterverzeichnisse prüft und sich ggf. selbst aufruft)
opendir (DIR, "$pfad");
@inhalt = readdir (DIR);
foreach $item (@inhalt)
{
if ($item =~ m/.htm/ig $item =~ m/.html/ig)
{
print "$item\n";
}
}
closedir DIR;
Sollte funktionieren wenn ich mich net irgendwo vertippt habe *g*.
HTH, Marko
Whoops, böser Fehler. Untenstehender Code checkt nur das im $pfad angegebene Verzeichnis.
Yo, denn soweit bin ich mit meinen bescheidenen Kenntnissen auch gekommen ;)
@a = glob("/verz*");
Für Unterverzeichnisse bräuchte man eine zusätzliche Sub, die aufgerufen wird, wenn chkdir($item) true ist, und die dann den HTML-Inhalt des Unterverzeichnisses auflistet (bzw. auf weitere Unterverzeichnisse prüft und sich ggf. selbst aufruft)
Gerade bei der Sub aber verläßt es mich ......
Danke aber
bonngrüße
Boris
opendir (DIR, "$pfad");
@inhalt = readdir (DIR);
foreach $item (@inhalt)
{
if ($item =~ m/.htm/ig $item =~ m/.html/ig)
{
print "$item\n";
}
}
closedir DIR;
Sollte funktionieren wenn ich mich net irgendwo vertippt habe *g*.
HTH, Marko
Hallo Boris!
Seltsamerweise ist Deine Nachricht abgeschnitten, obwohl sie im Quelltext korrekt steht, naja.
Kennt jemand die entsprechenden Zei ...len fuer Perl?
Die direkte Uebersetzung Deines bash-Scriptes ist ungefaehr:
#!/usr/local/bin/perl
@dateien = find . -name "\*htm\*"
;
for (@dateien) { print "Ich fand $_\n" }
Ansonsten kann man natuerlich auch mit den Hausmitteln von Perl eine Rekursion programmieren. Markus hat dafuer schon einen Ansatz geliefert.
Calocybe
Hallo Boris!
Seltsamerweise ist Deine Nachricht abgeschnitten, obwohl sie im Quelltext korrekt steht, naja.
Kennt jemand die entsprechenden Zei ...len fuer Perl?
Die direkte Uebersetzung Deines bash-Scriptes ist ungefaehr:
#!/usr/local/bin/perl
@dateien =find . -name "\*htm\*"
;
for (@dateien) { print "Ich fand $_\n" }Ansonsten kann man natuerlich auch mit den Hausmitteln von Perl eine Rekursion programmieren.
Das wäre mir prinzipiell lieber um plattformindependent zu bleiben. Daher suche ich ja noch noch der "nativen perl" Lösung.
Danke aber
bonngrüße
Boris
Markus hat dafuer schon einen Ansatz geliefert.
Calocybe
Hi!
Ansonsten kann man natuerlich auch mit den Hausmitteln von Perl eine Rekursion programmieren.
Das wäre mir prinzipiell lieber um plattformindependent zu bleiben. Daher suche ich ja noch noch der "nativen perl" Lösung.
Also gut, dann probier das mal. Bei mir unter WinNT hat's ganz gut funktioniert.
sub listdir {
my $path = shift;
my $mask = shift;
my (@dir, @subdirs, @files);
my $full;
opendir(DIR, "$path") return ();
@dir = readdir(DIR);
closedir DIR;
for (@dir) {
$fullname = "$path/$_";
push(@files, $fullname) if (/$mask/); # finds files and directories
### push(@files, $fullname) if ((-f $fullname) && /$mask/); # finds simple files only
push(@subdirs, $fullname) if ((-d $fullname) && !/^..?/);
}
for (@subdirs) {
push @files, listdir($_, $mask);
}
return @files;
}
print join("\n", listdir(".", ".*htm.*"));
Calocybe <-- das gehoert nicht mehr zum Code! ;-)
Also gut, dann probier das mal. Bei mir unter WinNT hat's ganz gut funktioniert.
Danke Dir, ist aber erstaunlich, daß man scheinbar doch ein paar mehr Zeilen braucht; ich dachte, da gäbe es ein dem "find" Befehl entsprechendes Instrumentarium in PERL, anstatt des (Hilfs-)Konstruktes.
Calocybe <-- das gehoert nicht mehr zum Code! ;-)
Na, verzichtet der Autor da etwa auf sein Recht auf Anerkennung der Urheberschaft gem. § 12 UrhG ;)
CU
Boris
Hi,
Alle *htm* Dateien in einem Verzeichnis nebst Unterverzeichnissen lassen sich unter UNIX wie folgt auffinden:
use File::Find;
find(&wanted, $verzeichnis);
sub wanted {
if (/.htm$/) { ... }
}
(ungetestet)
Mehr dazu in perldoc File/Find.
Cheatah