use strict; use warnings; use feature 'say'; use Path::Iterator::Rule; use Path::Tiny; my $root = './1204707'; my $in = $root . '/A'; my $to = $root . '/B'; my $rule = Path::Iterator::Rule->new; $rule->file->name( qr/txt$/ ); $rule->file->empty; my $next = $rule->iter( $in, { depthfirst => 1, visitor => sub { my $path = path( shift ); my $parent = $path->parent; $path->move( $to . '/' . $path->basename ); rmdir $parent if not $parent->children; }, }); while ( defined( my $file = $next->() ) ) { say "processing $file"; } __END__