Search code examples
perlperl-moduleperl-data-structures

How to get a list of leaf subdirectories in a root folder in Perl


I am very new to Perl (scripting languages in general) and I was wondering how to use Perl to get a lisitng of all the leaf directories in Perl. For example, lets say my root directory is C:

C: -> I have folder "A" and "B" and files a.txt and b.txt

Folder "A" -> I have folder "D" and file c.html
Folder "B" -> I have folder "E" and "F" and file d.html 
Folder "D", "E" and "F" -> bunch of text files

How do I get a bunch of directory paths as output for this scenario of:

C:\A\D\
C:\B\E\
C:\B\F\

As you can see, I just want a list of all the leaf directories possible. I dont want C:\A\ and C:\B\ to show up. After doign some reserarch myself, I have noticed that I may somehow be able to use the File::Find module in Perl, but that also I am not 100% sure about how to go ahead with.

Thanks for any help you may be able to provide :)


Solution

  • From an answer to the question How to Get the Last Subdirectories by liverpole on Perlmonks:

    prints all leaf directories under the current directory (see "./"):

    use strict;
    use warnings;
    
    my $h_dirs = terminal_subdirs("./");
    my @dirs   = sort keys %$h_dirs;
    print "Terminal Directories:\n", join("\n", @dirs);
    
    sub terminal_subdirs {
        my ($top, $h_results) = @_;
        $h_results ||= { };
        opendir(my $dh, $top) or die "Arrggghhhh -- can't open '$top' ($!)\n";
        my @files = readdir($dh);
        closedir $dh;
        my $nsubdirs = 0;
        foreach my $fn (@files) {
            next if ($fn eq '.' or $fn eq '..');
            my $full = "$top/$fn";
            if (!-l $full and -d $full) {
                ++$nsubdirs;
                terminal_subdirs($full, $h_results);
            }
        }
    
        $nsubdirs or $h_results->{$top} = 1;
        return $h_results;
    }