【问题标题】:Perl - Rename image files in directoryPerl - 重命名目录中的图像文件
【发布时间】:2021-04-20 20:13:50
【问题描述】:

我没有大量使用 perl。我有一个图像文件列表,需要用递增计数器重命名。

images folder

image_1_0.jpg
image_1_1.jpg
image_2_0.jpg
image_2_1.jpg
image_3_0.jpg
image_3_1.jpg
image_3_2.jpg
image_4_0.jpg
image_5_0.jpg
image_5_1.jpg
image_5_2.jpg
image_5_3.jpg
image_5_4.jpg
image_5_5.jpg
output would be

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg

我目前拥有的

my $dir = usr/local/bin/images

my counter = 0;

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

foreach my $oldfile(@files){
    (my $oldfileb = $oldfile =~ s/\.[^.]+$//; #get file without extention
    my $newfile = $dir/"$counter".jpg;

    rename ("$dir/$oldfileb", "dir/$newfile");counter++;
}

尝试更多地使用 Perl,但可以使用一些帮助。在代码的计数器部分给出错误

【问题讨论】:

  • 也许您正在寻找rename 实用程序。
  • 显然您遇到了错误。在寻求帮助时,您应该包括那些。此外,您应该使用use strict; use warnings; 来获取有关您的代码的关键信息。

标签: perl


【解决方案1】:

启动脚本

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

strictwarnings。 Perl 将保护您免受最常见的错误的影响。

字符串必须用引号括起来,如果后面有另一个语句,则每个语句都应该以分号结尾:

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

变量必须以符号开头:

my $counter = 0;

括号必须闭合:

(my $oldfileb = $oldfile) =~ s/\.[^.]+$//;

从 Perl 5.14 开始,您还可以使用更具可读性的/r 修饰符:

my $oldfileb = $oldfile =~ s/\.[^.]+$//r;

请注意,您应该跳过看起来不像图像名称的文件(例如,readdir 将在 *nix 上返回 ...)。您可能还想sort 文件。

/ 在引号之外是除法,. 是连接。

my $newfile = "$dir/$counter.jpg";

您已经将$dir 包含在$newfile 中:

rename "$dir/$oldfileb", $newfile;

检查rename的返回值是否有错误。

rename "$dir/$oldfileb", $newfile or warn "Can't rename $oldfile: $!";

【讨论】:

  • 更新了脚本并纠正了我的错误,谢谢大家。该脚本运行没有错误,但没有重命名文件,因此它们都保持不变。 @choroba
  • @Trey:随着你的进步尝试打印文件名。也许脚本没有找到任何文件?
  • 你肯定想在其中添加一个natsort(来自Sort::Key::Natural
猜你喜欢
  • 2012-01-17
  • 2014-11-08
  • 1970-01-01
  • 2015-04-26
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多