5

File::FindPerl のディレクトリの深さ (指定された検索の下) を、指定されたディレクトリその下の 1 & 2 サブディレクトリに制限できるようにしたいと考えています。

可能であれば、同時にファイルを列挙できるようにしたいと考えています。

絶対パスで機能する必要があります。

4

2 に答える 2

7

このperlmonks ノードは、GNU の find から mindepth と maxdepth を実装する方法を説明しています。

基本的に、ディレクトリ内のスラッシュの数を数え、それを使用して深さを決定します。前処理関数は、深さが 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
}
于 2012-03-29T06:14:08.557 に答える
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
);
于 2013-09-26T03:55:14.007 に答える