使用 perl 的重命名对文件列表重新编号,从某个值开始

使用 perl 的重命名对文件列表重新编号,从某个值开始

我正在尝试对文件列表重新编号,这些文件在文件名的给定点有一个由四位数字组成的索引。这些文件一致从0001开始输出,但需要从1001开始。

  • ./file_name.0001.jpg应该./file_name.1001.jpg
  • ./file_name.0734.jpg应该./file_name.1734.jpg
  • ETC。

我遇到过rename,但我对 Perl 不熟悉。即兴发挥例子,我相信这会起作用:

rename -n 's/\d{4}/our $i //= 1001; ++$i/e' -- *.jpg

不幸的是,到增量时,它似乎已经忘记了 $i:

Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at (user-supplied code).

对于重命名为已经存在的名称的文件来说,也不安全,但我不知道它会去哪里。

答案1

在这里,您似乎应该能够将数字加 1000:

rename -n -- 's/\d{4}/$& + 1000/e' *.jpg

请注意,\d{4}将匹配1234in 1234567。要匹配 4 位数字或更多数字的序列,您需要检查 是否\d{4}未被其他数字包围,因此:

rename -n -- 's/(?<!\d)\d{4}(?!\d)/$& + 1000/e' *.jpg

具体来说,您的问题是您用作/分隔s符并/在替换内部使用。当替换涉及代码时,我喜欢s{pattern}{replacement}flags代替s/pattern/replacement/flags.但你总是可以使用不同的角色,比如s:pattern:replacement:flags

rename -n -- 's{\d{4}}{our $i //= 1000; ++$i}e' *.jpg

一个可能更好的替代方法rename是使用zsh's zmv,它的优点是在进行任何重命名之前进行健全性检查:

autoload -Uz zmv
i=1000; zmv -n '(*)[0-9](#c4)(*.jpg)' '$1$((++i))$2'

或者查找 4 位或更多数字:

i=1000; zmv -n '(|*[^0-9])[0-9](#c4)(([^0-9]*|).jpg)' '$1$((++i))$2'

或者将数字加 1000:

zmv -n '(*)([0-9](#c4))(*.jpg)' '$1$(($2 + 1000))$3'

另请参阅<0-999>匹配表示 0 到 999 之间的数字(包括 1、01、0001、000000001...)的数字序列。(<0-999>~^[0-9](#c4))将匹配以 4 位数字表示的数字 0 到 999。

相关内容