2009-02-16 123 views
4

以下脚本将存储数组@file_list中的所有文件和目录。如何根据扩展名过滤文件名?

我该如何只过滤只有.lt6扩展名的文件?

opendir (CURRDIR, $localdir); 
@file_list = grep !/^\.\.?$/, readdir CURRDIR; 
print STDOUT "Found Files: @file_list\n"; 

欢呼

回答

9

试试这个:

grep(/\.lt6$/i, readdir(CURRDIR)) 

我用了很多次。它的工作原理,虽然现在我更喜欢使用File::Next这种事情。

例子:

use File::Next; 

my $iter = File::Next::files({ file_filter => sub { /\.lt6$/ } }, $localdir) 

while (defined (my $file = $iter->())) { 
    print $file, "\n"; 
} 
+0

相反类似答案 - 不区分大小写相较于未,和括号而不是括号。 :D – 2009-02-16 06:54:25

+0

我们彼此在一分钟内回答。伟大的思想家都认为8D。虽然在这种情况下,我猜我是西部最快的枪! – 2009-02-16 07:00:47

+0

是的 - 我应该知道在给出答案之前编辑问题:D – 2009-02-17 08:38:20

3

不要忘记closedir()

grep应该寻找:

my(@file_list) = grep /\.lt6$/, readdir CURRDIR; 

假设你的语法的其余部分是大致正确。

1
opendir (CURRDIR, $localdir); 
@file_list = grep m/\.lt6$/, readdir CURRDIR; 
closedir CURRDIR; 
print STDOUT "Found Files: @file_list\n"; 
0

,并添加一个小品种,你也可以做这样的东西:

opendir(DIR, $path) || die qq([ERROR] Cannot opendir "$path" - $!\n); 
my(@txt) = grep(m{\.txt$}, readdir DIR); 
rewinddir DIR; 
my(@lt6) = grep(m{\.lt6$}, readdir DIR); 
rewinddir DIR; 
my(@dirs) = grep(-d "$path/$_", readdir DIR); 
closedir DIR; 

等。

2

您可以使用File::Find::Rule;

use File::Find::Rule; 

print "FOUND:\n " 
    , join("\n " 
      , File::Find::Rule->file->name('*.lt6')->in($path) 
     ) 
    , "\n" 
    ; 
2
my @file_list = glob "$localdir/*.lt6"; 
-1

转到命令提示

CD \

DIR/S * .lt6> mydir.txt