An opendir and a grep is not a lot of work. Conversely, the different treatment of the top directory compared with others would make interfacing to File::Find comparatively awkward versus a more direct approach.
Traverse( "./", 1 );
sub Traverse { # returns 0 for empty else 1
my $dir = shift;
my $top = shift; # flag for different treatment of top dir
unless( opendir my $dh, $dir ) {
warn "$!: $dir\n";
$top or return 1;
}
for my $file ( grep !/^\.\.?/, readdir $dh ) {
my $path = "$dir/$file";
if ( -d $path ) {
if ( Traverse( $path, 0 ) ) {
$top or return 1;
}
else {
rmdir $path;
}
}
else {
$top or return 1;
}
}
closedir $dh;
return 0;
}