如何使用perl省略隐藏的目录文件?

时间:2017-02-27 04:11:28

标签: perl

我尝试使用perl从特定位置获取.config文件。但我想从隐藏目录中省略相同的扩展文件。如何将代码作为预期输出结果:

我尝试过的代码:

use strict;
use warnings;
use File::Find::Rule;
my @files = File::Find::Rule->file()
                            ->name( '*.config' )
                            ->in( '/home/rsa/MODE/' );
for my $file (@files) {
    print "file: $file\n";
}

上述代码的输出:

file:/home/rsa/MODE/p_s/p1/b1/c3/r1/rev.config
file:/home/rsa/MODE/p_s/p1/b1/c3/r5/.bhat/rev.config
file:/home/rsa/MODE/p_s/p1/b1/c3/r5/.lrayan/rev.config

预期产出:

我应该在没有隐藏目录文件扩展名的情况下得到输出。

file:/home/rsa/MODE/p_s/p1/b1/c3/r1/rev.config

2 个答案:

答案 0 :(得分:1)

该文档有一个跳过CSV目录的示例。在这种情况下,您需要做更多工作,因为.*也匹配.

my $rule = File::Find::Rule->new;

$rule->or( $rule->new
                ->directory
                ->name( '.*' )
                ->not_name( '.' )
                ->prune
                ->discard,
           $rule->new
                ->file
                ->name( '*.config' ));

my @files = $rule->in( $ENV{HOME} );

在评论中提及ikegami时,name->not_name可以通过

进行简化
->name( '.?*' )

->name( qr/^\../ )

即。点后跟任何东西。

答案 1 :(得分:0)

你可以在name中使用正则表达式而不是glob模式,就像这样

my @files = File::Find::Rule->file()
        ->name(  qr/^[^.].*\.config$/ )
        ->in( '/home/rsa/MODE/' )