Hi, ever wanted to use File::Find but didn't need to recurse all the way down into sub directories? This snippet demonstrates how to limit the recursion depth.
#!/usr/bin/perl # linux only or change slash type use warnings; use strict; use File::Find; use File::Spec; if (@ARGV < 2){print "Usage: $0 dir depth\n";exit} my ($path, $depth)= @ARGV; my $abs_path = File::Spec->rel2abs($path); # if . for dir my $m = ($abs_path) =~ tr!/!!; #count slashes in top path find (\&found,$abs_path); exit; sub found{ my $n = ($File::Find::name) =~ tr!/!!; #count slashes in file return $File::Find::prune = 1 if $n > ($m + $depth); # do stuff here. #print "$_\n"; #name only print "$File::Find::name\n"; #name with full path }

Replies are listed 'Best First'.
Re: File::Find limited recursion
by Aristotle (Chancellor) on Oct 18, 2002 at 17:46 UTC
    Have you seen the preprocess and postprocess predicates in newer versions of File::Find? It can be used for exactly that purpose.

    Makeshifts last the longest.

Re: File::Find limited recursion
by runrig (Abbot) on Oct 18, 2002 at 19:39 UTC
    File::Find::Rule has maxdepth and mindepth methods/parameters which do that (though they are really just shortcuts to File::Spec->splitdir and maxdepth uses $File::Find::prune).
Re: File::Find limited recursion
by belg4mit (Prior) on Oct 18, 2002 at 16:17 UTC
    Since you're using File::Spec you should probably be using splitdir.
    Unlike just splitting the directories on the separator, empty directory names ("''") can be returned, because these are significant on some OSs (e.g. MacOS).
    And since something like // would only occur if it were fed to File::find, counting the number of elements in the list should be fine.

    --
    perl -wpe "s/\b;([mnst])/'$1/g"

Re: File::Find limited recursion
by princepawn (Parson) on Oct 18, 2002 at 16:48 UTC
    There is a prune option to File::Find that should do what you want. Trouble is, I could never get it to work.