perl遍历目录

时间:2011-06-22 15:56:57

标签: perl

我正在尝试获取指定路径中所有目录的名称

我尝试了下面的内容,但这不仅仅是在我指定的路径

下来的每个级别
find(\&dir_names, "C:\\mydata\\");
sub dir_names {
    print "$File::Find::dir\n" if(-f $File::Find::dir,'/');
}

4 个答案:

答案 0 :(得分:17)

my @dirs = grep { -d } glob 'C:\mydata\*';

答案 1 :(得分: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";
   }
 } 

答案 2 :(得分:1)

请参阅Automating System Administration with Perl中的第2章文件系统。这为我们提供了这个:

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.
        }
    }
}

答案 3 :(得分:0)

globreaddir也可能是我的选择。另一种方法是使用windows dir命令来完成这项工作:

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