我正在尝试对文件列表重新编号,这些文件在文件名的给定点有一个由四位数字组成的索引。这些文件一致从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}
将匹配1234
in 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。