【问题标题】:Perl - Rename and Sort Image FilesPerl - 重命名和排序图像文件
【发布时间】:2021-04-23 19:58:23
【问题描述】:

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

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";

}

可以在这个问题上使用一些见解。

【问题讨论】:

  • 我真正要问的是如何匹配和替换 image_1_0.jpg 为 1.jpg 等

标签: regex perl


【解决方案1】:

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

my @files = sort readdir($dh);

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

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

【讨论】:

  • 唯一的问题是如果我有 image_10_0 或 image_11_0 。它不是重命名大于 9 的那些。我尝试了我的 @files = sort grep ^[0-9]|[1-9][0-9]|[1-9][0-9][0-9]$ , readdir($dh),但那只是剩下的 image_10_0 到 image_20_0 而不是 image_1_0 到 image_9_0。
  • 然后调整正则表达式以适应您想要接受的任何内容。我向您展示了一种技术,而不是编写您的代码。
【解决方案2】:

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

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

use strict;
use warnings;

my $counter = 0;

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

【讨论】:

  • glob 是更好的解决方案,但我希望更好地描述您的答案。此外,glob 对其输出进行排序,如here 所述。也许是小优化。
  • 如果您解释了为什么会这样,您的答案会更好。对于已经在代码中苦苦挣扎的人来说,代码是不够的。
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多