2014-01-29 39 views
3

我有一個數組一組目錄作爲Perl的文件::查找::規則排除目錄從一個數組

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

我使用的文件尋找一種方式::查找::規則來找到所有文件在/ tmp 遞歸地,但不包括來自@dir中的文件。

我可以

my $rule = File::Find::Rule->new; 
$rule->file; 
my @files = $rule->in(@dir); 

得到@dir所有文件,但我不能否定的條件,那就是排除@dir。我正在嘗試

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

但沒有輸出。

+0

您的例子不工作,因爲他們沒有有效的Perl代碼。請修正語法。 – simbabque

回答

6

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'); 

考慮下面這個例子:

[email protected]:~/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; 

現在我運行此:

[email protected]:~/temp> perl file-find.pl 
[ 
    "filefind", 
    "filefind/baz.txt", 
    "filefind/bar", 
    "filefind/bar/bar.txt", 
    "filefind/bar/foobar.txt", 
] 
+0

在引用文檔之後,我最初嘗試了同樣的方法,但是這也是空的輸出。嘗試目錄列表作爲一個數組,並作爲一個空格分隔的字符串,但都沒有工作。 – nohup

+0

剛剛嘗試過。它適用於我的文件系統中的文件夾。 – simbabque

+0

@nohup看到我的更新後的一個工作示例 – simbabque

相關問題