零焊盘重命名,例如图像(2).jpg - >图像(002).jpg

时间:2010-12-30 09:44:25

标签: perl bash

我需要重命名所有图像,因为标题在所有子文件夹中都有解释。我正在考虑用正则表达式提取括号内的数字然后重命名它。在我周围搜索时,我看到有renamemmv等工具,但我无法让它们重命名jpgs。

我很感激任何建议来解决我的问题。

BTW:适用于Windows,我有cygwin bash和perl。

修改
在完成所有答案的实验后得出结论。

  1. Cygwin rename不好,我可以上班的人不接受正则表达式,但绝对是一个不错的选择,例如通过运行Linux VM并安装Win SharedFolder。
  2. 您可以使用renamethis shell script为Cygwin构建更好的sed工具。
  3. pwd的Windows等效项仅为cd
  4. Hugmeir使用Perl 5.13+发布了一个很有前途的解决方案,这些解决方案是dev版本,但是当你读到它时,可能会保持稳定。
  5. pad_left sub可能不是printf语法的更好替代方法,但它可以工作。

4 个答案:

答案 0 :(得分:7)

rename命令可以这样做:

rename 's/\d+/sprintf("%03d",$&)/e' *.jpg

使用子目录:

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

答案 1 :(得分:1)

以下代码在Linux上进行了测试;我不知道您可能需要修改什么才能让它在您的环境中工作。此外,我没有包括任何搜索.jpg文件的子目录;如果您希望我以这种方式修改代码,请告诉我。

编辑:,对于子目录范围的搜索,请进一步查看程序版本)

use strict;
use warnings;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

my @files = glob "*.jpg";

my @padded_names = map {
                          my $name = $_;
                          $name =~ s/^([\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
                          $name;
                       } @files;

foreach (0..$#files) {
   rename($files[$_], $padded_names[$_]);
   print "$files[$_] --> $padded_names[$_]\n";
}

上述程序重命名文件并打印以下内容:

file(1).jpg --> file(001).jpg
file(2).jpg --> file(002).jpg
file(20).jpg --> file(020).jpg
file(200).jpg --> file(200).jpg

HTH

编辑:以下是上述程序的改进版本 - 它现在还包含搜索.jpg文件的子目录。我知道我的代码不再需要,因为现在已经给出了解决子目录问题的答案,但是嘿......:)

use strict;
use warnings;
use File::Find;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

sub new_name {
   if (/\.jpg$/) {
      my $name = $File::Find::name;
      my $new_name;
      ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
      rename($name, $new_name);
      print "$name --> $new_name\n";
   }
}

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
                            # image-containing sub-directories

find(\&new_name, $localdir);

答案 2 :(得分:1)

perl -MFile::Find::Rule -E 'rename($_, s/ \( \K ([0-9]+) (?= \) ) / sprintf("%03s", $1) /rex) for File::Find::Rule->file->name("*.jpg")->in($ARGV[0])' directory_here

由于/ r标志,这只适用于5.13+ Perls。

编辑:对于Windows,您必须使用双引号更改外部引号,并且要么转义sprintf和名称中的引号,要么使用不同的分隔符,ala qq!%03d!

编辑2:哇,完全搞砸了那里的分隔符。

答案 3 :(得分:0)

再次在切线路径上,如果你在Windows上,你的目标是重命名文件而不是做一些编程),试试免费软件Siren(http://www.scarabee-software.net/en/siren.html它完全符合要求,例如尝试以下表达式Image \(%N1{3}\).%le。特别是,请查看专门针对图片的%X*表达式。