Perl对目录中的文件进行计数和编号

Perl对目录中的文件进行计数和编号,perl,Perl,我正在寻找一种方法来对目录中的文件进行计数和编号/重命名,其中1-9之间的文件以零开头。它必须基于File::find,虽然这可能不是最有效的方法,但后来我不得不将其集成到一个更大的代码中,该代码基于该函数,很难重写。 ‘File1’、‘File2’、‘File3’、‘File10’、‘File11’等变为‘01’。档案1,"02。文件2',…'10文件10',11。文件11'等 use strict; use warnings; use File::Find; find(\&ren

我正在寻找一种方法来对目录中的文件进行计数和编号/重命名,其中1-9之间的文件以零开头。它必须基于File::find,虽然这可能不是最有效的方法,但后来我不得不将其集成到一个更大的代码中,该代码基于该函数,很难重写。 ‘File1’、‘File2’、‘File3’、‘File10’、‘File11’等变为‘01’。档案1,"02。文件2',…'10文件10',11。文件11'等

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;
    }
 }

你可能需要调整它来满足你的特定需求,但我认为它应该为你指明正确的方向。顺便说一下,我建议将“
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上的a/e选项来执行sprintf,而不仅仅是用一个文本字符串替换

顺便说一句,使用File::Find,您已经完成了95%的任务,但是对于将来可能不那么琐碎的任务,我非常喜欢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;
    }
}

在阅读文档时,您所要做的似乎就是调用find,使用想要的子例程尝试匹配
$\u=~/^\ d\d/
,如果是这样,则在名称后面附加一个0来重命名该文件。哦,并增加一些计数变量来计数。如果找到的文件在开始时缺少2位数字-计数&重命名为1到9/01、02、03、…10、11等的文件,前导0/@thebourneid你能更新你的问题吗,你不太清楚你想要什么吗?似乎有两种情况,一种是开头没有数字,另一种是开头只有一个数字。添加几个您将看到的示例文件,您希望将它们更改为什么样的文件会很好。e、 g.
1filename.txt=>01filename.txt
11filename.txt=>11filename.txt
对不起。我的问题确实有误导性。我对它进行了编辑,总结一下,我正在寻找一种无例外地对文件进行计数和编号的方法。my$count在词汇范围内,但在该范围外调用的子例程中被引用。只需+++$count并忽略问题,或者切换到globals
our()
以获取$count。谢谢DavidO。以下是您的建议中的两行内容,这两行内容在经过一些测试后几乎对我有效:$file=~s/^([^\d\d\.\s].*)$/sprintf”%02d\.$1“,$count++/e$file=sprintf“%02d\.$\”,$count++;我唯一搞不懂的是如何从1而不是从0计算文件数
my$count=1这是我们设置起始编号的地方。这是我做的第一件事,但代码仍然从零开始计数,并将第一个文件重命名为“00”,而不是“01”。请在更新编辑中发布您的代码。不要从原始帖子中删除任何内容,只需添加一个包含代码片段的更新部分,这样我就可以看到问题所在。我可能没有时间,但会尽快尝试。大卫非常非常感谢你的帮助。Seth Robertson指出了一个问题,我必须在子例程之外定义$count,代码现在就可以工作了。我不确定是我应该发布最终解决方案,还是你应该编辑你的最后建议。