I started by setting up a sample set of test directories:
[mcmahon@joe-desk ~]$ ls -R ./example/
./example/:
file nonempty_files_only nonempty_has_dirs
./example/nonempty_files_only:
file1 file2
./example/nonempty_has_dirs:
file1 one two
./example/nonempty_has_dirs/one:
./example/nonempty_has_dirs/two:
That's a directory containing files and other (nonempty) directories, one containing only files, and one containing a file and two empty directories.
sub dive {
my($d) = shift;
return if ! -d $d;
my @contents = glob("$d/*");
return $d unless @contents;
my @below = map { dive($_) } @contents;
return @below
? @below # Stuff below qualifies, this doesn't
: $d; # Nothing below qualifies, this does
}
$d = './example';
print join ", ", dive($d),"\n";
This prints
./example/nonempty_files_only, ./example/nonempty_has_dirs/one, ./exam
+ple/nonempty_has_dirs/two
The tricky bit is postponing the decision about whether the current directory is good until you've seen if any subdirectories of it qualify.
Edit: Removed the majority of the comments as they were actually obscuring how short this is; renamed @queue as it was a leftover from a previous, longer, iterative version.
-
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.