Perl遍历目录

9
我正在尝试获取指定路径中所有目录的名称。
我尝试了以下方法,但这给了我指定路径下每一层级的目录名称,而不仅仅是该路径下的目录名称。
find(\&dir_names, "C:\\mydata\\");
sub dir_names {
    print "$File::Find::dir\n" if(-f $File::Find::dir,'/');
}

1
“每一级向下”听起来像是您在标题中所要求的:“遍历目录”。 - TLP
4个回答

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

非常感谢FMc,运行得非常好!您能否解释一下-d是什么意思?我知道grep和global,但无法弄清楚{ -d }的含义。谢谢。 - Parik Tiwari
4
它将glob的结果筛选为只有目录。这是众多文件测试运算符之一:请参阅http://perldoc.perl.org/functions/-X.html。 - FMc

8
请使用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";
   }
 } 

这将提供所有文件,而不仅仅是目录。您仍然需要使用grep命令。 - TLP
在您的foreach循环中,您可能还想跳过只有点的目录。可以使用以下代码:next if $key eq "." || $key eq ".."; - Matthew Lock

1
请参阅使用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.
        }
    }
}

这段代码是错误的,你需要这样才能使其正常工作:if (-d "$workdir\$name")。 - Sam B

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接