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

使用Find::File::Rule查找Perl脚本并排除.bak文件,perl,Perl,我正在使用查找Perl脚本。我想排除某些文件,如测试文件和备份文件,但如果文件以点开头,则无法排除*.bak文件,例如(p.pl): 这将产生以下输出: ("p.pl", ".c.bak") 鉴于预期产出应为: "p.pl" "p.pl" 这里的问题是,带有点前缀的文件与“*.bak”量词不匹配,因为它们是“隐藏”文件 如果您chdir到您的目录并执行echo*或echo*.bak操作,您也不会在那里看到该文件。如此有效-该规则不匹配,因为它是一个隐藏文件 解决办法是: 显式匹配“.”文

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

这将产生以下输出:

("p.pl", ".c.bak")
鉴于预期产出应为:

"p.pl"
"p.pl"

这里的问题是,带有点前缀的文件与“*.bak”量词不匹配,因为它们是“隐藏”文件

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

解决办法是:

  • 显式匹配“.”文件的新规则
  • 正则表达式匹配到“name”就可以了
比如:

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

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

#!/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"