Perl File :: Find ::规则从数组中排除目录

时间:2014-01-29 12:30:25

标签: perl find file-find

我在数组中有一组目录为

chdir /tmp;
my @dir=("test" "abc" "def")

我正在寻找一种方法,使用File :: Find :: Rule来查找/ tmp 递归中的所有文件,但不包括@dir中的文件。

我可以通过

从@dir获取所有文件
my $rule =  File::Find::Rule->new;
$rule->file;
my @files = $rule->in( @dir );

但我不能否定这个条件,即排除@dir。我在尝试

chdir /tmp;
@files = File::Find::Rule->new
    ->file()
    ->name(@dir)
    ->prune
    ->in( "." );

但没有输出。

1 个答案:

答案 0 :(得分:7)

documentation列出了这个例子:

  

忽略CVS目录

my $rule = File::Find::Rule->new; $rule->or($rule->new
               ->directory
               ->name('CVS')
               ->prune
               ->discard,
          $rule->new);
     

请注意这里使用空规则。空规则匹配他们看到的任何内容,因此效果是匹配(和丢弃)名为' CVS'或匹配任何东西

你可以probalby做同样的事情:

my @exclude_dirs = qw(test abc def);
my $rule = File::Find::Rule->new; 
$rule->or($rule->new
               ->directory
               ->name(@exclude_dirs)
               ->prune
               ->discard,
          $rule->new);
my @files = $rule->in('/tmp');

考虑这个例子:

foo@bar:~/temp/filefind> tree
.
├── bar
│   ├── bar.txt
│   └── foobar.txt
├── baz.txt
└── foo
    └── foo.txt

2 directories, 4 files

以下是代码:

#!/usr/bin/perl
use strictures;
use File::Find::Rule;
use Data::Dump;

my @exclude_dirs = qw(foo);
my $rule = File::Find::Rule->new; 
$rule->or($rule->new
               ->directory
               ->name(@exclude_dirs)
               ->prune
               ->discard,
          $rule->new);
my @files = $rule->in('filefind');
dd \@files;

现在我运行这个:

foo@bar:~/temp> perl file-find.pl
[
  "filefind",
  "filefind/baz.txt",
  "filefind/bar",
  "filefind/bar/bar.txt",
  "filefind/bar/foobar.txt",
]