Perl计数和目录中的数字文件

时间:2011-06-28 18:23:44

标签: perl

我正在寻找一种方法来计算和编号/重命名目录中的文件,其中前导零为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;
    }
 }

1 个答案:

答案 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;
    }
}
相关问题