在特定子目录中的递归唯一搜索 - Perl

时间:2013-07-25 06:33:10

标签: perl file-io

这是我的目录结构..

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

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

2 个答案:

答案 0 :(得分: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;
        }   
}

答案 1 :(得分: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;
}