使用Perl File::Find::Rule从数组中排除目录

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

但没有输出。


你的示例无法正常工作,因为它们不是有效的Perl代码。请修复语法。 - simbabque
1个回答

7

文档中列出了以下示例:

ignore CVS directories

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

Note here the use of a null rule. Null rules match anything they see, so the effect is to match (and discard) directories called 'CVS' or to match anything

你可能也可以做同样的事情:

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",
]

我最初也尝试了相同的方法,参考了文档,但是结果仍然为空。我尝试将目录列表作为数组和以空格分隔的字符串,但两者都没有起作用。 - nohup
刚试了一下,对我来说在我的文件系统中可以工作。 - simbabque
1
出现了错误。我在子程序中重新定义了一个之前已经声明和使用过的变量。谢谢simbabque。 - nohup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接