use strict; use warnings; use File::Find; use Cwd; my $deleted=0; my $keep=0; $|++; sub recurse { my $dir=shift; chdir $dir or die "chdir $dir:$!"; my $dirname=cwd; #print "$dirname\n"; my @dirs; my @files; for my $name (glob '*') { next unless $name=~/[^.]/; if (-d $name) { push @dirs,$name if recurse($name); } else { push @files,$name; } } chdir ".."; unless (@dirs or @files) { print "X: $dirname\n"; rmdir $dir or warn "$dirname:$!"; $deleted++; } else { print "k: $dirname (d: " . scalar(@dirs) . " | f: ".scalar(@files).")\n"; $keep++; } return @dirs+@files; } recurse $_ for @ARGV; print "Deleted $deleted directories, kept $keep directories\n";