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__ #### $ ls -goR 1204707 # File size here # | # V 1204707: total 8 drwxrwxr-x 5 4096 Dec 2 08:56 A drwxrwxr-x 2 4096 Dec 2 08:56 B 1204707/A: total 12 drwxrwxr-x 2 4096 Dec 2 08:56 aa drwxrwxr-x 3 4096 Dec 2 08:56 bb drwxrwxr-x 2 4096 Dec 2 08:56 cc 1204707/A/aa: total 20 -rw-rw-r-- 1 8 Dec 2 08:56 file1.txt -rw-rw-r-- 1 0 Dec 2 08:56 file2.txt 1204707/A/bb: total 20 drwxrwxr-x 2 4096 Dec 2 08:56 aaa -rw-rw-r-- 1 0 Dec 2 08:56 file3.txt -rw-rw-r-- 1 0 Dec 2 08:56 file4.txt 1204707/A/bb/aaa: total 8 -rw-rw-r-- 1 0 Dec 2 08:56 file7.txt 1204707/A/cc: total 20 -rw-rw-r-- 1 0 Dec 2 08:56 file5.txt -rw-rw-r-- 1 8 Dec 2 08:56 file6.dat 1204707/B: total 0 #### $ perl 1204707.pl processing ./1204707/A/aa/file2.txt processing ./1204707/A/bb/aaa/file7.txt processing ./1204707/A/bb/file3.txt processing ./1204707/A/bb/file4.txt processing ./1204707/A/cc/file5.txt #### ls -goR 1204707 1204707: total 8 drwxrwxr-x 4 4096 Dec 2 08:57 A drwxrwxr-x 2 4096 Dec 2 08:57 B 1204707/A: total 8 drwxrwxr-x 2 4096 Dec 2 08:57 aa drwxrwxr-x 2 4096 Dec 2 08:57 cc 1204707/A/aa: total 12 -rw-rw-r-- 1 8 Dec 2 08:56 file1.txt 1204707/A/cc: total 12 -rw-rw-r-- 1 8 Dec 2 08:56 file6.dat 1204707/B: total 40 -rw-rw-r-- 1 0 Dec 2 08:56 file2.txt -rw-rw-r-- 1 0 Dec 2 08:56 file3.txt -rw-rw-r-- 1 0 Dec 2 08:56 file4.txt -rw-rw-r-- 1 0 Dec 2 08:56 file5.txt -rw-rw-r-- 1 0 Dec 2 08:56 file7.txt