我正在使用此代码处理我的文件夹和带有两个子文件的文件:
仅用于文件夹名称的“子文件夹”
仅用于扩展名的文件名的“子文件”
但我意识到“子文件夹”会在重命名过程中混淆带有扩展名的文件。
如何区分流程,或者说“子文件夹”重命名没有扩展名的“名称”和“子文件”以重命名“姓名”的智能方法是什么?
find(\&folders, $dir_source);
sub folders {
my $fh = $File::Find::dir;
my $artist = (File::Spec->splitdir($fh))[3];
if (-d $fh) {
my $folder_name = $_;
# some substitution
rename $folder_name, $_;
}
}
find(\&files, $dir_source);
sub files {
/\.\w+$/ or return;
my $fn = $File::Find::name;
my ($genre, $artist, $boxset, $album, $disc);
if ($fn =~ /Singles/ or $fn =~ /Box Set/) {
($genre, $artist, $boxset, $album, $disc) = (File::Spec->splitdir($fn))[2..6];
}
else {
($genre, $artist, $album, $disc) = (File::Spec->splitdir($fn))[2..5];
}
if (-e $fn) {
my $file_name = $_;
# some substitution
rename $file_name, $_;
}
}
答案 0 :(得分:1)
File :: Find :: find()为每个文件和文件夹调用您的sub。如果您只想影响文件夹,请忽略文件:
你需要调用finddepth()而不是find(),因为你正在改变目录名(你需要在更“浅”的目录之前重命名“更深层”的目录)。
finddepth(sub {
return unless -d;
(my $new = $_) =~ s/this/that/ or return;
rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!";
}, ".");
替代多次替换:
finddepth(sub {
return unless -d;
my $new = $_;
for ($new) {
s/this/that/;
s/something/something_else/;
}
return if $_ eq $new;
rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!";
}, ".");
在文件sub中,我会做出第一个声明:
return unless -f;