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