我有很多的文件,我想重新命名,我试图做一个定期表达它们匹配,但即使我被困在文件被命名为如:

文件名01

文件名称100

文件名02

文件名03

等等,我想添加一个"0"(零),后面的任何文件,该文件是小于100,像这样:

文件名001

文件名称100

文件名002

文件名003

最近我们有了这么多,因为他们匹配是使用这个找型d|排序-r|查询'[1-9][0-9]$'但是我不能找出替换他们。预先感谢任何的帮助,你可以给我.Im CentOS如果这是任何帮助,这一切正在通过SSH。

有帮助吗?

解决方案

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

一个有点矫枉过正也许,但它确实是什么问。

其他提示

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

或者类似的东西,提供

  1. 你有GNU找到和GNU xargs(对 -print0-0)
  2. 你有'重新命名'实用工具,来perl
  3. 只有一个组中的数字文件。如果有多个,然后你需要做的事情与regex使它只有匹配的数量要重新格式化。

这是一个一次性的事情吗?如果是的话,我会建议一些可能似乎被这里很多程序员是一个警察出来:

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

然后扔掉该脚本。

有是有点小题大做和小机会,你会通过有一些企图在一个聪明的(但不充分的调试)的单行熄灭到杂草上的文件最终会搬起石头砸自己的脚。

运行两个命令,在该命令:

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

首先一个重命名一切小于10,并预置为零。第二个重命名一切小于100,并预置一个零。结果应该是三位数字的所有的文件名。

在我的Debian它工作得很好与重命名,用300个文件进行测试。

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

我觉得 MMV 是你的朋友在这里。

您可以使用Perl或红宝石做一些事情。

把所有这些文件在同一目录

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

如果您的遥控器具有的bash

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

删除 “回声” 做实际重命名

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top