Sundar
Sundar

Reputation: 111

Getting the list of subdirectories (only top level) in a directory using Perl

I would like to run a perl script to find only the subdirectories in a directory. I would not like to have the "." and ".." returned.

The program I am trying to use looks like this:

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";
}

The output of this however, has the "." and "..". How do I exclude them from the list?

Upvotes: 11

Views: 38833

Answers (5)

dime
dime

Reputation: 1

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";
}

Upvotes: 0

toolic
toolic

Reputation: 62105

File::Slurp read_dir automatically excludes the special dot directories (. and ..) for you. There is no need for you to explicitly get rid of them. It also performs checking on opening your directory:

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";
}

Upvotes: 1

SymKat
SymKat

Reputation: 871

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

Also, the module File::Find::Rule makes a vary nice interface for this type of thing.

use File::Find::Rule;

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

Upvotes: 9

Sam Choukri
Sam Choukri

Reputation: 1904

If you want to collect the dirs into an array:

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

If you really just want to print the dirs, you can do:

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

Upvotes: 12

ewh
ewh

Reputation: 1024

Just modify your check to see when $name is equal to '.' or '..' and skip the entry.

Upvotes: 4

Related Questions