【问题标题】:perl iterate through directoriesperl 遍历目录
【发布时间】:2011-06-22 15:56:57
【问题描述】:

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

我尝试了以下方法,但这让我不仅在我指定的路径上降低了每个级别

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

【问题讨论】:

  • “每一级下来”听起来确实像您在标题中要求的那样:“遍历目录”。

标签: perl


【解决方案1】:
my @dirs = grep { -d } glob 'C:\mydata\*';

【讨论】:

  • 非常感谢 FMc,工作就像一个魅力!你能解释一下 -d 的作用吗,我知道 grep 和 global 但无法弄清楚 { -d } 的作用。谢谢
  • @ParikshitTiwari 它将 glob 的结果过滤到仅目录。它是众多文件测试运算符之一:请参阅perldoc.perl.org/functions/-X.html
【解决方案2】:

改用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。
  • 你可能也想在你的 foreach 循环中跳过只有点的目录next if $key eq "." || $key eq "..";
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2016-07-24
      • 2017-09-29
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多