Perl - 重命名和排序图像文件

Perl - Rename and Sort Image Files

我有一些图像想要重命名和排序,但是当我重命名它们时,它们并没有按相同的顺序重命名。我得到了我想要的输出,但它们不是从原始文件中排序的。我真正要问的是如何匹配和替换下面的示例。

Code is current output:
image_1_0.jpg -> 6.jpg
image_1_1.jpg -> 4.jpg

Code output wanted:
image_1_0.jpg -> 1.jpg
image_1_1.jpg -> 2.jpg

图片文件夹


image_1_0.jpg
image_1_1.jpg
image_2_0.jpg
image_2_1.jpg
image_3_1.jpg
image_3_2.jpg
image_3_3.jpg
image_4_0.jpg
image_5_0.jpg

输出将是

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg

这是我的

#! /usr/bin/perl
use warnings;
use strict;

my $file;
my @imagesFile;
my $counter = 0;

my $dir = 'usr/local/bin/images';

opendir (IMGDIR, "$dir") or die "Cannot open directory: $!";
@imagesFile = (readdir(IMGDIR));
closedir IMGDIR;

foreach my $file(@imagesFile){
$counter++;

rename "$dir/$file", "$dir/$counter.jpg";

}

可以使用一些关于这个问题的见解。

readdir 不会 return 按排序顺序排列文件名。如果您希望图像在递增它们的最终名称时按某种顺序排列,您必须自己做。

my @files = sort readdir($dh);

而且,您可能希望至少删除 ... 虚拟目录,以及您不想定位的任何其他文件。更好的是选择您想要的文件:

my @files = sort grep /image_\d_\d.jpg/, readdir($dh);

请检查以下代码是否符合您的要求。

#!/usr/bin/env perl
#
# vim: ai ts=4 sw=4

use strict;
use warnings;

my $counter = 0;

rename $_, ++$counter . '.jpg' for sort glob("*.jpg");