Сначала вы хотите обработать более глубокие результаты, поэтому обработайте список в обратном порядке.Вы можете переименовать только часть листа пути;Вы получите более мелкие детали позже.
use Path::Class qw( dir );
for ( reverse @fd ) {
my $dir = dir($_);
my $parent = $dir->parent;
my $old_leaf = my $new_leaf = $dir->dir_list(-1);
$new_leaf =~ s/\s+/ /g;
if ($new_leaf ne $old_leaf) {
my $old_file = $parent->dir($old_leaf);
my $new_file = $parent->dir($new_leaf);
# Prevent accidental deletion of files.
if (-e $new_file) {
warn("$new_file already exists\n");
next;
}
rename($old_file, $new_file);
}
}
Ответ на оригинальный вопрос:
Я не понимаю, как в игру вступает FFR.
rename 'Test1/Test2/Test3', 'Test1/Test2/Dir3';
rename 'Test1/Test2', 'Test1/Dir2';
rename 'Test1', 'Dir1';
Для произвольных путей:
use Path::Class qw( dir );
my @parts1 = dir('Test1/Test2/Test3')->dir_list();
my @parts2 = dir('Dir1/Dir2/Dir3' )->dir_list();
die if @parts1 != @parts2;
for (reverse 0..$#parts1) {
my $path1 = dir(@parts1[ 0..$_ ]);
my $path2 = dir(@parts2[ 0..$_ ]);
rename($path1, $path2);
}
Или, может быть, вы хотите переименовать все Test1 в Dir1, Test2 в Dir2 и Test3 в Dir3, обработать список в обратном порядке.
my %map = (
'Test1' => 'Dir1',
'Test2' => 'Dir2',
'Test3' => 'Dir3',
);
my $pat = join '|', map quotemeta, keys %map;
for ( reverse @fd ) {
my $o = $_;
my $n = $_;
$n =~ s{/\K($pat)\z}{$map{$1}};
if ($n ne $o) {
if (-e $n) {
warn("$n already exists\n");
next;
}
rename($o, $n);
}
}