使用Find :: File :: Rule查找Perl脚本并排除.bak文件

时间:2014-11-11 11:18:15

标签: perl

我正在使用Find::File::Rule来查找Perl脚本。我想要排除某些文件,例如测试文件和备份文件,但如果它们以点开头,我就无法排除*.bak个文件,例如(p.pl):

use warnings;
use strict;
use Data::Dump;
use File::Find::Rule;

open(my $fh,">",".c.bak");
print $fh "#! /usr/bin/env perl\n";
close($fh);

my $rule = File::Find::Rule->new;
$rule->or(
    $rule->new->name('*.bak')->prune->discard,
    $rule->new->grep( qr/^#!.*perl\s*$/, [ sub { 1 } ] )
   );
my @files=$rule->in(".");
dd @files;

这给出了输出:

("p.pl", ".c.bak")

而预期的输出应为:

"p.pl"

2 个答案:

答案 0 :(得分:1)

这里的问题是前缀为点的文件不会被' * .bak'匹配。量词,因为他们隐藏了#39;文件。

如果您chdir到您的目录并执行echo *echo *.bak,您也不会在那里看到该文件。如此有效 - 该规则不匹配,因为它是一个隐藏文件。

解决方案将是:

  • 新规则明确匹配'。'文件。
  • 正则表达式匹配' name'会做的伎俩

类似的东西:

$rule->new->name(qr/\.bak$/)->prune->discard,

答案 1 :(得分:1)

您只需为隐藏的备份文件添加另一个过滤规则:

#!/usr/bin/perl

use warnings;
use strict;
use Data::Dump;
use File::Find::Rule;

open(my $fh,">",".c.bak");
print $fh "#! /usr/bin/env perl\n";
close($fh);

my $rule = File::Find::Rule->new;
$rule->or(
    $rule->new->name('*.bak')->prune->discard,
    $rule->new->name('.*.bak')->prune->discard,            # <== hidden backups
    $rule->new->grep( qr/^#!.*perl\s*$/, [ sub { 1 } ] )
   );
my @files=$rule->in(".");
dd @files;

注意模式中的起始.。 这个脚本将产生:

"p.pl"