[Vienna-pm] find in several directories

Baier Oliver oliver.baier at lotterien.at
Wed Feb 20 01:42:50 PST 2008


Hallo Josef,

--- snip ---
	Whereas File::Spec provides functions for some common
	path manipulations, Path::Class provides an object-oriented
	model of the world of path specifications and their
	underlying semantics.
--- snip ---

Danke für diesen Input! Hört sich echt gut an.

Über File::Spec bin ich bei der Suche schon gestolpert,
aber File::Path habe ich übersehn.

Werd das gleich mal antesten.

thx,
Oliver


> -----Ursprüngliche Nachricht-----
> Von: vienna-pm-bounces+oliver.baier=lotterien.at at pm.org 
> [mailto:vienna-pm-bounces+oliver.baier=lotterien.at at pm.org] 
> Im Auftrag von Josef
> Gesendet: Dienstag, 19. Februar 2008 19:42
> An: vienna-pm at pm.org
> Betreff: Re: [Vienna-pm] find in several directories
> 
> Hi, allerseits!
> 
> Peter J. Holzer schrieb:
> > On 2008-02-18 19:19:30 +0100, Baier Oliver wrote:
> >> Josef hat mir vor einer Minute eine gleichwertige Lösung geschickt.
> >>
> >> Mein Problem dabei ist, dass ich File::Find bei dieser Variante
> >> das Toplevel-Verzeichnis zur Suche übergeben müsste, was bei
> >> Millionen von Dateien dann aber schnell recht mühsam wird.
> > 
> > Das ist aber in der allgemeinen Form Deines Problems (finde alle
> > Directories, deren Pfad eine Regex R1 matcht, und darin alle Files,
> > deren Name eine Reges R2 matcht) unvermeidlich. [...]
> > d.h., Du musst das
> > ganze Filesystem durchsuchen.
> > [...] Aber das erfordert bereits eine inhaltliche Analyse der Regex,
> > und das ist bei Perl-Regex halt schwierig.
> 
> Nun ja ich ging mal davon aus, dass er es ihm reicht wenn er
> ein oder mehrere Startverzeichnisse angeben kann, also ungefähr
> weiß wo er suchen soll und das es seinen Ansprüchen damit genügt.
> 
> Aber um auf das von Dir aufgebrachte allgemeinere Problem
> einzugehen.
> Noch ne Lösung mit File::Find::find's preprocess·Option.
> 
> Nochmal leicht abgeändert:
> my $chkdirRE 
> =qr'^/content(?:/nemat(?:/parts(/\d+(?:/tid\d*/?)?)?)?)?$';
> # ^- test um festzustellen ob tiefer in das Verz. gegangen 
> werden soll.
> my $dirRE    =qr'^/content/nemat/parts/\d+/tid\d*/?$';
> my $fileRE   =gr'^id\d+_\d+_(\d+)\.xml$';
> my @startdirs=('/');
> # v- ungetestet (nach wie vor)
> use File::Find qw(find);
> use Path::Class qw(dir);
> my @result;
> find { preprocess => sub { grep { !-d $_ ||
>                                    
> dir($_)->absolute=~/$chkdirRE/¹ } @_
>                           },
>         wanted     => sub { push @result,$File::Find::name
>                                if -f $_ && /$fileRE/ &&
>                                   $File::Find::dir=~/$dirRE/²
>                           }
>       }, map { dir($_)->absolute } @startdirs;
> 
> print map "$_\n", @result;
> 
> ad 1) Oder in der Art $_=~$chkdirpartRE[$level] ...
> ad 2) Unter bestimmten Umständen kann auf diese Zeile verzichtet
>        werden...
> 
> Und schon saust File::Find nicht mehr durch unnötige Verzeichnisse.
> In diesen Fall ist auch Path::Class::Iterator interessant.
> Geht damit aber nachdem selben Schema.
> 
> 
> >> Ich stelle mir vor, dass es irgendwo ein Pendant zu 'ls' gibt.
> > ls sucht auch nur rekursiv durch. Falls Du das Pendent zum Shell
> > Globbing meinst, das gibt es auch in Perl und heißt glob.
> 
> Diesen diesbezüglich wichtig Hinweis, lass ich mal so stehen.
> 
> pfiateng,
>    Josef
> 
> _______________________________________________
> Vienna-pm mailing list
> Vienna-pm at pm.org
> http://mail.pm.org/mailman/listinfo/vienna-pm
> 


More information about the Vienna-pm mailing list