0

这是我的目录结构..

                                    Current
                   /                    |                       \
           a                            d                       g
        /      \                   /             \              | 
        b       c                e              morning         evenin
       /  \    /   \             |
     hello hi  bad good          f
                                 /  \   
                               good night

当前,a,b,c,d,e,f,g 是目录,其他是文件。现在我想在当前文件夹中递归搜索,这样搜索不应该只在当前目录的 g 文件夹中进行。另外,由于“好”文件在 current-ac-good 和 current-def-good 中是相同的,所以它的内容应该只列出一次。你能帮我怎么做吗?

4

2 回答 2

1

Paulchenkiller在评论中的建议很好。该File::Find模块递归搜索,并让我们轻松处理在遍历过程中如何处理文件和目录。在这里,您可以找到与您正在寻找的类似的东西。它使用preprocess选项来修剪目录和wanted获取所有文件名的选项。

#!/usr/bin/env perl

use strict;
use warnings;
use File::Find;

my (%processed_files);

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

for ( keys %processed_files ) { 
        printf qq|%s\n|, $_;
}

sub dir_preprocess {
        my (@entries) = @_; 
        if ( $File::Find::dir eq '.' ) { 
                @entries = grep { ! ( -d && $_ eq 'g' ) } @entries;
        }   
        return @entries;
}

sub wanted {
        if ( -f && ! -l && ! defined $processed_files{ $_ } ) { 
                $processed_files{ $_ } = 1;
        }   
}
于 2013-07-25T07:10:17.240 回答
0
my $path = "/some/path";
my $filenames = {};

recursive( $path );

print join( "\n", keys %$filenames );

sub recursive
{
    my $p = shift;
    my $d;

    opendir $d, $p;

    while( readdir $d )
    {
        next if /^\./; # this will skip '.' and '..' (but also '.blabla')

        # check it is dir
        if( -d "$p/$_" )
        {
            recursive( "$p/$_" );
        }
        else
        {
            $filenames->{ $_ } = 1;
        }
    }

    closedir $d;
}
于 2013-07-25T06:44:00.773 回答