使用Perl获取目录中的子目录列表(仅限顶级)

时间:2011-04-22 02:55:27

标签: perl

我想运行一个perl脚本来只查找目录中的子目录。我不想拥有“。”和“..”返回。

我尝试使用的程序如下:

use warnings;
use strict;

my $root = "mydirectoryname";

opendir my $dh, $root
  or die "$0: opendir: $!";

while (defined(my $name = readdir $dh)) {
  next unless -d "$root/$name";
  print "$name\n";
}

然而,这个输出有“。”和“......”。如何从列表中排除它们?

5 个答案:

答案 0 :(得分:12)

如果你想将dirs收集到一个数组中:

my @dirs = grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);

如果你真的只想打印dirs,你可以这样做:

print "$_\n" foreach grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);

答案 1 :(得分:8)

next unless $name =~ /^\.\.?+$/;

此外,模块File :: Find :: Rule为这类事物提供了一个很好的界面。

use File::Find::Rule;

my @dirs = File::Find::Rule->new
    ->directory
    ->in($root)
    ->maxdepth(1)
    ->not(File::Find::Rule->new->name(qr/^\.\.?$/);

答案 2 :(得分:4)

只需修改您的支票,看看$ name是否等于'。'或'..'并跳过该条目。

答案 3 :(得分:1)

File::Slurp read_dir自动排除特殊点目录(。和..) 为了你。你没有必要明确地摆脱它们。它还执行打开目录的检查:

use warnings;
use strict;
use File::Slurp qw(read_dir);

my $root = 'mydirectoryname';
for my $dir (grep { -d "$root/$_" } read_dir($root)) {
    print "$dir\n";
}

答案 4 :(得分:0)

use warnings;
use strict;

my $root = "mydirectoryname";

opendir my $dh, $root
  or die "$0: opendir: $!";

while (defined(my $name = readdir $dh)) {
  next unless -d "$root/$name";
  next if $file eq ".";
  next if $file eq "..";
  print "$name\n";
}