6

我有很多要重命名的文件,我试图制作一个正则表达式来匹配它们,但即使我被困在文件上,这些文件的命名方式如下:

文件名 01

文件名 100

文件名 02

文件名 03

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

文件名 001

文件名 100

文件名 002

文件名 003

我最接近匹配它们的是使用这个 find -type d | 排序-r | grep ' [1-9][0-9]$' 但是我不知道如何替换它们。提前感谢您提供的任何帮助。如果有任何帮助,我在 CentOS 上,所有这些都是通过 SSH 完成的。

4

9 回答 9

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

可能有点矫枉过正,但它可以满足要求。

于 2009-12-02T23:33:28.780 回答
10
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

或类似的东西,提供

  1. 你有 GNU find 和 GNU xargs (for -print0and -0)
  2. 您有 perl 附带的“重命名”实用程序
  3. 文件名中只有一组数字。如果不止一个,那么您需要对正则表达式做一些事情,以使其仅匹配您要重新格式化的数字。
于 2009-12-02T23:24:15.563 回答
4

这是一次性的吗?如果是这样,我将在这里提出一些可能被许多程序员认为是警察的东西:

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

然后扔掉剧本。

几乎没有什么大惊小怪的机会,你最终会通过尝试一个聪明的(但调试不充分的)单线进入你的文件中的杂草而最终把自己开枪打死。

于 2009-12-02T23:25:38.713 回答
2

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

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

第一个重命名小于 10 的所有内容并在前面添加一个零。第二个重命名小于 100 的所有内容并在前面添加一个零。结果应该是所有文件名的三位数字。

于 2009-12-02T23:25:34.063 回答
1

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

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
于 2009-12-02T23:35:10.820 回答
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”以进行实际重命名

于 2009-12-03T00:09:11.187 回答
0

我认为mmv是你的朋友。

于 2009-12-02T23:21:36.457 回答
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
于 2009-12-02T23:25:38.210 回答
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);
    }
}
于 2009-12-02T23:34:46.700 回答