[Vienna-pm] WG: find in several directories

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Tue Feb 19 02:13:14 PST 2008


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. Deine Regex
qr{/content/nemat/parts/\d+/tid\d*} matcht übrigens auch 
"/tmp/foo/content/nemat/parts/7/tid/bar/gazonk", d.h., Du musst das
ganze Filesystem durchsuchen. Ich nehme an, die Regexes sollten links
und rechts verankert sein, was es erlaubt, in /content/nemat/parts/ mit
der Suche anzufangen und nur zwei Levels berücksichtigen zu müssen. Aber
das erfordert bereits eine inhaltliche Analyse der Regex, und das ist
bei Perl-Regex halt schwierig.

Im konkreten Fall würde ich das wegen der bekannten Anzahl Levels von
Hand lösen:

level1('/content/nemat/parts/');

sub level1 {
    my ($d) = @_;
    opendir(my $dh, $d) or return;
    for (grep { /^\d+$/ } readdir($dh)) {
	level2("$d/$_");
    }
}

sub level2 {
    my ($d) = @_;
    opendir(my $dh, $d) or return;
    for (grep { /^tid\d*$/ } readdir($dh)) {
	level3("$d/$_");
    }
}

sub level3 {
    my ($d) = @_;
    opendir(my $dh, $d) or return;
    for (grep { /^id\d+_\d+_(\d+)\.xml$/ } readdir($dh)) {
	do_something_with_file("$d/$_");
    }
}

(man kann auch die drei Loops ineinanderschachteln, aber kurze Subs
finde ich übersichtlicher).

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

> Die Perl-regexen in der Schnittstelle kann man auch zu [0-9] & Co
> umwandeln lassen.

Wenn Du mit "[0-9] & Co" Globs meinst, hast Du das Problem wesentlich
vereinfacht, weil die sehr viel einfacher als Regex sind.

	hp

-- 
   _  | Peter J. Holzer    | It took a genius to create [TeX],
|_|_) | Sysadmin WSR       | and it takes a genius to maintain it.
| |   | hjp at hjp.at         | That's not engineering, that's art.
__/   | http://www.hjp.at/ |	-- David Kastrup in comp.text.tex
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20080219/4b09979a/attachment.bin 


More information about the Vienna-pm mailing list