http://www.perlmonks.org/index.pl?node_id=206331

Description: 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 
}

comment on File::Find limited recursion
Download Code
Re: File::Find limited recursion
by belg4mit 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"

 [reply]
Re: File::Find limited recursion
by princepawn 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.
 [reply]
d/l code
 [reply]
Re: File::Find limited recursion
by Aristotle 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.

 [reply]
Re: File::Find limited recursion
by runrig 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).
 [reply]

Back to Snippets Section