我正在寻找一种方法来计算和编号/重命名目录中的文件,其中前导零为1-9。它必须基于File :: find,虽然它可能不是最有效的方式,但后来我必须将它集成到一个更大的代码中,这个代码基于该函数并且很难重写。 'File1','File2','File3'....'File10','File11'等变为'01。 File1','02。 File2',...'10。 File10','11。 File11'等。
use strict;
use warnings;
use File::Find;
find(\&rename_files, $dir_source);
sub rename_files {
/\.flac$/ or return;
my $fd = $File::Find::dir;
my $fn = $File::Find::name;
my $file = $_;
rename $file, $_;
}
更新:这是一个有效的解决方案,但有一个例外,即代码开始从0开始计算文件,尽管$ count设置为1。
use strict;
use warnings;
use File::Find;
my $dir_source = '';
find(\&rename_files, $dir_source);
{
my $count = 1;
sub rename_files {
return if not -f $_ or not /\.flac$/;
my $file = sprintf "%02d\. $_", $count++;
print "$file\n";
rename $_, $file;
}
}
答案 0 :(得分:2)
您可能需要根据您的具体需求进行调整,但我认为它应该指向正确的方向。顺便说一下,我建议在测试/调试阶段用“rename $_, $file
”替换“print "rename $_, $file\n";
”行,这样你就可以看到它启用时会做什么,而不是它做了什么它完成后错了。 ;)
以下是片段:
use strict;
use warnings;
use File::Find;
find(\&rename_files, $dir_source);
{
my $count = 0;
sub rename_files {
return if not /\.flac$/;
my $file = $_;
return if not -f $file;
$file =~ s/^([^\d]{2})(?=\.)/sprintf "%2d$1", $count++/e;
rename $_, $file;
}
}
它使用一个大约$ count的闭包给你的sub一个计数器,并在你的替换RE上执行一个/ e选项来执行sprintf而不只是替换为文字字符串。
顺便说一句,你已经有了95%的File :: Find,但是对于未来,也许不那么琐碎的任务,我真的很喜欢File :: Find :: Rule的干净界面。您可以查看它,看看它是否可能成为未来更好的工具。
更新:鉴于原始问题的更新,我会修改代码如下:
use strict;
use warnings;
use File::Find;
find(\&rename_files, $dir_source);
{
my $count = 0;
sub rename_files {
return if not -f $_ or not /\.flac$/;
my $file = sprintf "%2d$_", ++$count;
rename $_, $file;
}
}