如何使用Perl轻松批量重命名文件?

时间:2009-12-02 23:13:39

标签: perl file rename bulk

我有很多文件我正在尝试重命名,我试图制作一个正则表达式来匹配它们,但即使我被卡在文件上也被命名为:

  

档案名称01

     

档案名称100

     

文件名02

     

文件名03

等,我想在任何小于100的文件后面添加一个“0”(零),如下所示:

  

档案名称001

     

档案名称100

     

文件名002

     

文件名003

我最接近匹配他们的是使用这个find -type d | sort -r | grep'[1-9] [0-9] $'然而我无法弄清楚如何更换它们。提前感谢您提供给我的任何帮助。我在CentOS上如果有任何帮助,所有这些都是通过SSH完成的。

9 个答案:

答案 0 :(得分:12)

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

可能有点矫枉过正,但它确实提出了要求。

答案 1 :(得分:9)

find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

或类似的东西,提供

  1. 你有GNU find和GNU xargs(-print0-0
  2. 您拥有perl
  3. 附带的'rename'实用程序
  4. 文件名中只有一组数字。如果有多个,那么你需要对正则表达式做一些事情,使它只匹配你想重新格式化的数字。

答案 2 :(得分:4)

这是一次性的吗?如果是这样的话,我会在这里向许多程序员提出一些可能看起来像警察的建议:

将命令的输出(find -type d | sort -r | grep ' [1-9][0-9]$')传递给文件,并使用编辑器和一些全局搜索/替换魔法来创建执行重命名的脚本。

然后扔掉脚本。

通过尝试巧妙(但没有经过充分调试)的单行插入文件中的杂草,你可能会有点大惊小怪,并且很有可能最终用脚射击自己。

答案 3 :(得分:2)

按以下顺序运行两个命令:

$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *

首先重命名小于10的所有内容并预先设置为零。第二个重命名小于100的所有内容,并预先设置为零。所有文件名的结果应为三位数。

答案 4 :(得分:1)

在我的debian中,它适用于重命名,使用300个文件进行测试。

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt

答案 5 :(得分:0)

我认为mmv是你的朋友。

答案 6 :(得分:0)

你可以用perl或ruby做点什么。

将所有这些文件放在同一目录中

dirlisting = DIR.entries('.')

dirListing.each do |file| 
 num = file.match(/\d+$/).to_i
 if num < 100
   find the position where start the number, with index and inject the 0 there.
 end
end

答案 7 :(得分:0)

use strict;
use File::Copy;

my @files = glob 'File*Name*';

foreach my $filename (@files) {
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
        my $number = $1;
        next if ($number > 99);
        rename $filename, sprintf("FileName%03d",$number);
    }
}

答案 8 :(得分:0)

如果你的遥控器有bash shell

for i in File*; 
do 
    case "${i##* }" in  [0-9][0-9] ) 
      echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done

删除“echo”以进行实际重命名