4

我在数组中有一组目录

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( "." );

但没有输出。

4

1 回答 1

7

文档列出了这个例子:

忽略 CVS 目录

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

注意这里使用了一个空规则。空规则匹配他们看到的任何东西,所以效果是匹配(并丢弃)名为“CVS”的目录或匹配任何东西

你可以做同样的事情:

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",
]
于 2014-01-29T12:46:44.453 回答