我正在使用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"
答案 0 :(得分:1)
这里的问题是前缀为点的文件不会被' * .bak'匹配。量词,因为他们隐藏了#39;文件。
如果您chdir
到您的目录并执行echo *
或echo *.bak
,您也不会在那里看到该文件。如此有效 - 该规则不匹配,因为它是一个隐藏文件。
解决方案将是:
类似的东西:
$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"