2009-02-16 78 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