我需要重命名所有图像,因为标题在所有子文件夹中都有解释。我正在考虑用正则表达式提取括号内的数字然后重命名它。在我周围搜索时,我看到有rename
和mmv
等工具,但我无法让它们重命名jpgs。
我很感激任何建议来解决我的问题。
BTW:适用于Windows,我有cygwin bash和perl。
修改
在完成所有答案的实验后得出结论。
rename
不好,我可以上班的人不接受正则表达式,但绝对是一个不错的选择,例如通过运行Linux VM并安装Win SharedFolder。rename
为this shell script为Cygwin构建更好的sed
工具。pwd
的Windows等效项仅为cd
。答案 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*
表达式。