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; }