2011-06-22 193 views
7

我試圖在指定的路徑來獲取所有目錄的名稱perl的遍歷目錄

我嘗試以下,但,讓我每級下調不只是在我指定的

find(\&dir_names, "C:\\mydata\\"); 
sub dir_names { 
    print "$File::Find::dir\n" if(-f $File::Find::dir,'/'); 
} 
+1

「每層下來」聽起來都像你在標題中所要求的:「遍歷目錄」。 – TLP

回答

15
路徑
my @dirs = grep { -d } glob 'C:\mydata\*'; 
+0

非常感謝FMc,就像一個魅力!請你解釋一下-d是什麼,我知道grep和global,但是不能弄清楚{-d}做了什麼。謝謝 –

+1

@ParikshitTiwari它將glob的結果過濾爲只是目錄。它是許多文件測試運營商之一:請參閱http://perldoc.perl.org/functions/-X.html。 – FMc

6

使用opendir代替

opendir DIR, $dirname or die "Couldn't open dir '$dirname': $!"; 
my @files = readdir(DIR); 
closedir DIR; 
#next processing... 

編輯:

「這將給所有的文件,而不僅僅是目錄。你仍然需要grep的「

是的,在這種情況下,你可以使用文件測試操作,看它是否是一個目錄或不

在Windows中:。

$dirname="C:\\"; 
opendir(DIR, $dirname); 
@files = readdir(DIR); 
closedir DIR; 
foreach $key (@files) 
{ 
    if(-d "$dirname\\$key") 
    { 
    print "$key\n"; 
    } 
} 
+0

這將給所有的文件,而不僅僅是目錄。你仍然需要grep。 – TLP

+1

編輯。感謝您指出這一點。 – Rahul

0

globreaddir可能會是我的選擇太另一種方法是使用Windows dir命令來完成這項工作。

my @dirs = qx(dir /AD /B); 
chomp @dirs; 
1

請參閱第2章文件系統Automating System Administration with Perl。這爲我們提供了:

sub ScanDirectory{ 
    my ($workdir) = shift; 
    chdir($workdir) or die "Unable to enter dir $workdir:$!\n"; 
    opendir(DIR, ".") or die "Unable to open $workdir:$!\n"; 
    my @names = readdir(DIR) or die "Unable to read $workdir:$!\n"; 
    closedir(DIR); 

    foreach my $name (@names){ 
     next if ($name eq "."); 
     next if ($name eq ".."); 

     if (-d $name){     # is this a directory? 
      #Whatever you want to do goes here. 
     } 
    } 
}