2010-05-12 107 views

回答

11

您需要結合使用opendirreaddirclosedir功能與-f文件測試操作:

opendir(my $dh, $some_dir) || die $!; 
while(my $f = readdir $dh) { 
    next unless (-f "$some_dir/$f"); 
    print "$some_dir/$f\n"; 
} 
closedir $dh; 
+1

File :: Find在我看來是更一般的更好的答案。 – 2010-05-12 18:11:12

+3

如果您不想對整個樹進行深度優先搜索,File :: Find不是您要查找的Droid。 – 2010-05-16 00:04:09

1

您想要readdir運算符。

例如:

#! /usr/bin/perl 

use warnings; 
use strict; 

my $dir = "/tmp/foo"; 
opendir my $dh, $dir 
    or die "$0: opendir: $!"; 

while (defined(my $name = readdir $dh)) { 
    next unless -f "$dir/$name"; 
    print "$name\n"; 
} 

運行它:

$ ls -F /tmp/foo 
a b c d/ 

$ ./prog.pl 
b 
c 
a

正如你所看到的,在名字他們物理存儲在文件系統中的順序,這並不一定是出來排序。

要進入快速和骯髒的路線,你也可以使用水珠操作符如

print map { s!^.*/!!; "$_\n" } 
     grep !-d $_ => 
     </tmp/foo/*>; 

請注意,你必須從結果中刪除目錄,以及水珠符不返回名稱以點開頭的文件。

2

使用File::Find。這是一個核心模塊。

use File::Find; 
find(\&wanted, @directories_to_search); 
sub wanted 
{ 
    my $file = shift; 
    return unless (-f $file); 
    #process file 
} 
+1

這是最好的答案,因爲它使用已經編寫和測試的庫。 File :: Find是核心Perl,所以你不需要安裝任何東西。 – Ether 2010-05-12 18:02:15

+7

請記住,這將遞歸列出指定目錄的所有子目錄中的所有文件。 – toolic 2010-05-12 18:30:17

3

你可以使用文件test「operator」(真的是一個函數)來檢查你想要的文件類型。

在要掃描當前目錄,使用使用grep一個文件名匹配的簡單情況:

my @files = grep -f, <*>; 

否則,您可以使用目錄處理工作:

opendir my $dh, $dirpath; 

my @files = grep -f, readdir($dh); 

closedir $dh; 

opendirreaddir,closedir,-Xgrep

5

另一種方式列出目錄中的所有文件是使用read_dir函數從CPAN模塊File::Slurp

use strict; 
use warnings; 
use File::Slurp qw(read_dir); 

my $dir = './'; 
my @files = grep { -f } read_dir($dir); 

它執行執行opendir檢查你。請記住,它包含任何「隱藏」文件(以點開頭的文件)。這不會遞歸地列出指定目錄的子目錄中的文件。

1

File::Find::Rule從CPAN使這完全瑣碎:

use File::Find::Rule; 
my @files = File::Find::Rule->file->in($directory); 

這個發現在給定的目錄或任何子目錄中的所有文件。我推薦這是因爲極其靈活和簡單的結合。

+0

這可以用來查找路徑中的所有文件: a/**/**/b/**/c.txt – yarian 2011-06-22 22:58:42

+0

當然!你只需要添加一個name()調用到這個文件之後 - 但一定要使用Unix風格的通配符(單星號)。如果你想要:你可以在那裏使用正則表達式:name('。* something [A-Z]。* \。foo')。所以你可以在($ directory)中說File :: Find :: Rule-> file-> name('a/*/*/b/*/c.txt') - >來查找你的示例文件。 – 2011-06-23 20:42:43

相關問題