首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >零垫重命名,例如图像(2).jpg ->图像(002).jpg

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

Stack Overflow用户
提问于 2010-12-30 09:44:24
回答 4查看 1.3K关注 0票数 2

我需要重命名所有的图像,因为标题解释在所有的子文件夹。我正在考虑用正则表达式提取括号内的数字,然后重命名它。环顾四周,我发现有像renamemmv这样的工具,但我无法让它们重新命名jpgs。

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

顺便说一句:是用于Windows的,我有cygwin和perl。

编辑:

结论对所有答案进行了实验。

  1. Cygwin rename不好,我可以工作的那个不接受regex,但是肯定是一个不错的选择,例如运行Linux和安装一个Win SharedFolder。
  2. 您可以使用rename使用这个shell脚本为Cygwin构建一个更好的sed工具。
  3. 对于pwd而言,Windows的等效值只是cd
  4. Hugmeir发布了一种很有希望的解决方案,它使用的是开发版Perl 5.13+,但是当您阅读这篇文章时,它可能是稳定的。
  5. pad_left子可能不是printf语法的更好的替代方法,但它可以工作。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-30 10:04:33

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

(编辑:为子目录范围内的搜索,请参阅程序版本进一步向下)

代码语言:javascript
运行
复制
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";
}

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

代码语言:javascript
运行
复制
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文件的子目录。我知道我的代码已经不需要了,因为现在已经给出了解决子目录问题的答案,但是.:)

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2010-12-30 10:16:56

rename命令可以这样做:

代码语言:javascript
运行
复制
rename 's/\d+/sprintf("%03d",$&)/e' *.jpg

与子目录:

代码语言:javascript
运行
复制
find . -type f -name \*.jpg -print0|xargs -0 rename 's/\d+/sprintf("%03d",$&)/e'
票数 7
EN

Stack Overflow用户

发布于 2010-12-30 15:53:11

代码语言:javascript
运行
复制
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

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

编辑:对于Windows,你必须用双引号改变外部引号,或者转义sprintf和name中的引号,或者使用不同的分隔符ala!%03d!

EDIT2:哇,完全搞砸了我的定界符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4561576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档