这是我的目录结构..
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中相同,因此它的内容应该只列出一次。 你能帮帮我怎么做吗?
答案 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;
}