[英]Using Find::File::Rule to find Perl scripts and exclude .bak files
我正在使用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"
這里的問題是,前綴為點的文件與'* .bak'量詞不匹配,因為它們是“隱藏”文件。
如果您將chdir
轉到目錄並執行echo *
或echo *.bak
,則也不會在該文件中看到該文件。 如此有效-該規則不匹配,因為它是一個隱藏文件。
解決方案是:
就像是:
$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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.