This code is probably a little too tricky, however if I'm right, it just does what it needs to.
#! /usr/bin/perl
use 5.010;
use strict;
use warnings;
use File::Find;
my $dir = $ARGV[0] // q{.};
sub deepest {
return if not -d;
state $prev_dir = '';
say if index $prev_dir, $_;
$prev_dir = $_;
}
find(
{ wanted => \&deepest,
no_chdir => 1,
bydepth => 1,
},
$dir
);
The main idea behind this code is the following: if you traverse your directory structure in depth-first order, then you only need to check whether your current directory path is not a prefix (a slice starting at position 0) of the previous directory path. If it's not a prefix of the previous value, then print it.
To ease the understanding: your sample dir structure in depth-first order:
a/b/d/g/h
a/b/d/g/i
a/b/d/g # this is a prefix of the previous, so we don't want it
a/b/d
a/b/k # this is not a prefix of the previous, so we want it
a/b/c/e
a/b/c
a/b
a
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.