Reputation: 111
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
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
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
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
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
Reputation: 1024
Just modify your check to see when $name is equal to '.' or '..' and skip the entry.
Upvotes: 4