批量重命名文件名,使用数字按字母顺序排序

批量重命名文件名,使用数字按字母顺序排序

我想批量重命名包含数字的文件,并用零填充数字。目标是在任何应用程序中按字母顺序对编号的文件集进行正确排序。

在一组具有相同前缀文本后跟数字的文件中,我想用与最高数字的位数相同的零填充每个数字。

即像这样命名的文件列表:

xx 1 abc.txt
xx 2 def.txt
xx 3 ghi.txt
xx 3.5 jkl.txt
xx 4a mno.txt
xx 4b pqr.txt
...
xx 100 end.txt

应该变成:

xx 001 abc.txt
xx 002 def.txt
xx 003 ghi.txt
xx 003.5 jkl.txt
xx 004a mno.txt
xx 004b pqr.txt
...
xx 100 end.txt

(系统为Windows XP)

(Windows 资源管理器使用某种启发式方法来种类以这种方式将数字添加到文件中,并不总是正确的。然而,我正在寻找一种方法来真正改名文件)

附录

我提到这个问题作为可能的重复: 我如何批量重命名文件? 据我所知,那里提到的工具(Bulk Rename Utility、AntRenamer、Free Commander Portable 等)无法检测每组文件所需的最小填充量。

我的想法是这样的:Explorer 能够检测带有连续数字的文件,即使它们是左对齐且没有填充,就像我上面的第一个示例一样。它使用这种检测来正确地对文件进行排序。
(例如,请参阅http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
我正在寻找一种可以进行相同检测的工具,但也可以相应地重命名文件。
(找到每个相关文件集的最大数字,而不是简单地找到整个目录中的最大数字,然后在每组中填充数字。)

或者换句话说:我想对目录中的所有文件进行“自然排序”,然后重命名它们,以便 ascii 排序与“自然排序”相同

我现在怀疑没有工具能够做到这一点,所以我可能只需要编写一个脚本。

答案1

这应该在基本层面上起作用。请先备份!

cd 到包含文件的目录:99999 - description.txt

perl rename-pad.pl

#!/usr/bin/perl
opendir(DIR, ".");
@files = sort(grep(/txt$/i, readdir(DIR)));
closedir(DIR);

$len=0;
foreach $file (@files) {
    print $file."\n";
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $len=(length($1)>$len)?length($1):$len;
    }
}
foreach $file (@files) {
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $newfile=sprintf("%0${len}d%s", $1, $2);
        rename("$file", "$newfile");
    }
}

相关内容