2011-06-22 56 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. 
     } 
    } 
}