Boris Hoeller: Verzeichnisse rekursiv 'abgrasen'

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

  1. 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

    1. 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

      1. 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

  2. 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

    1. 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

      1. 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! ;-)

        1. 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

  3. 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