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