簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM