你想先处理更深的结果,所以在处理反向列表。您只能重命名路径的叶子部分;稍后你会到达更浅的部分。
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到方向1,test2将方向2,和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);
}
}
的可能的复制[Perl的:递归重命名所有的文件和目录],那么该脚本会从基本目录“测试”相对于工作目录中的目录名称中删除空格(http://stackoverflow.com/问题/ 2557199/perl-recursively-rename-all-files-and-directories) – amphetamachine