使用Perl的文件时::找到一个快速的&限制搜索深度的简便方法?

时间:2012-03-29 06:06:43

标签: perl directory depth file-find

我希望能够将Perl的File::Find限制到目录深度(指定搜索下方)到指定目录 1&它下面有2个子目录。

如果可能的话,我希望能够同时枚举这些文件。

必须使用绝对路径。

2 个答案:

答案 0 :(得分:5)

这个perlmonks node解释了如何从GNU的find中实现mindepth和maxdepth。

基本上,它们计算目录中的斜杠数,并使用它来确定深度。然后preprocess函数只返回深度小于max_depth的值。

my ($min_depth, $max_depth) = (2,3);

find( {
    preprocess => \&preprocess,
    wanted => \&wanted,
}, @dirs);

sub preprocess {
    my $depth = $File::Find::dir =~ tr[/][];
    return @_ if $depth < $max_depth;
    return grep { not -d } @_ if $depth == $max_depth;
    return;
}

sub wanted {
    my $depth = $File::Find::dir =~ tr[/][];
    return if $depth < $min_depth;
    print;
}

根据您的情况量身定做:

use File::Find;
my $max_depth = 2;

find( {
    preprocess => \&preprocess,
    wanted => \&wanted,
}, '.');

sub preprocess {
    my $depth = $File::Find::dir =~ tr[/][];
    return @_ if $depth < $max_depth;
    return grep { not -d } @_ if $depth == $max_depth;
    return;
}

sub wanted {
    print $_ . "\n" if -f; #Only files
}

答案 1 :(得分:3)

这是另一个通过计算File::Find::find返回的目录数来确定File::Spec->splitdir内的当前深度的解决方案,它应该比计算斜杠更便携:

use strict;
use warnings;

use File::Find;

# maximum depth to continue search
my $maxDepth = 2;

# start with the absolute path
my $findRoot = Cwd::realpath($ARGV[0] || ".");

# determine the depth of our beginning directory
my $begDepth = 1 + grep { length } File::Spec->splitdir($findRoot);

find (
  {
    preprocess => sub
      { @_ if (scalar File::Spec->splitdir($File::Find::dir) - $begDepth) <= $maxDepth },
    wanted => sub
      { printf "%s$/", File::Spec->catfile($File::Find::dir, $_) if -f },
  },
  $findRoot
);