你想先處理更深的結果,所以在處理反向列表。您只能重命名路徑的葉子部分;稍後你會到達更淺的部分。
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