替换目录中所有文件的文件名中的计数器

kar*_*tos 6 regular-expression rename batch-jobs

将相机中的 1000 个文件导入到硬盘后,我意识到在重命名文件的过程中使用的计数器不是从 0 开始的。这导致文件结构如下:

My vacation 2018-05-03 2345.jpg
My vacation 2018-05-03 2346.jpg
My vacation 2018-05-04 2347.jpg
Run Code Online (Sandbox Code Playgroud)

我想批量重命名蜡中的所有文件,索引以 0 开头

My vacation 2018-05-03 0001.jpg
My vacation 2018-05-03 0002.jpg
My vacation 2018-05-04 0003.jpg
Run Code Online (Sandbox Code Playgroud)

我已经完成了一些处理批量重命名文件和添加计数器/索引(bash 循环)或使用重命名/预命名的主题,但我无法为我的案例找到可行的解决方案。

基本上,我想使用正则表达式将文件名的部分与描述和日期进行匹配.*(\d\d\d\d\-\d\d\-\d\d){1},并在末尾添加后缀计数器。

Sté*_*las 5

zsh

$ autoload -Uz zmv
$ zmv -n '(* )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
Run Code Online (Sandbox Code Playgroud)

(然后,-n如果满意的话,删除(空运行))。

对于更明确的匹配,要求文件名中包含日期 (XXXX-XX-XX)

zmv -n '(* [0-9](#c4)(-[0-9](#c2))(#c2) )(<->)(.jpg)' '$1${(l[4][0])$(($3 - 2344))}$4'
Run Code Online (Sandbox Code Playgroud)

或者

zmv -n '(* <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
Run Code Online (Sandbox Code Playgroud)

数字减去 2344。或者,您也可以按照它们的顺序排列它们,并从 1 开始编号,忽略已经存在的数字的值。如果您还希望每次日期之前的前缀发生变化时号码都会重新启动,您可以这样做:

$ typeset -A n=()
$ zmv -n '((*) <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$((++n[\$2]))}$4'
mv -- 'My other vacation 2021-01-05 0044.jpg' 'My other vacation 2021-01-05 0001.jpg'
mv -- 'My other vacation 2021-01-05 0045.jpg' 'My other vacation 2021-01-05 0002.jpg'
mv -- 'My other vacation 2021-01-05 0046.jpg' 'My other vacation 2021-01-05 0003.jpg'
mv -- 'My other vacation 2021-01-05 0047.jpg' 'My other vacation 2021-01-05 0004.jpg'
mv -- 'My other vacation 2021-01-05 0048.jpg' 'My other vacation 2021-01-05 0005.jpg'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
Run Code Online (Sandbox Code Playgroud)


Qua*_*odo 4

在文件名中,我们需要将后跟点 \xe2\x80\x94 \\d+.\xe2\x80\x94 的数字序列替换为后跟点 \xe2\x80\x94 的 4-0 填充计数器sprintf("%04d.", ++$c)

\n
rename -n -- \'our $c; s/\\d+\\./sprintf("%04d.", ++$c)/e\' *.jpg\n
Run Code Online (Sandbox Code Playgroud)\n

对于没有零填充的情况,我们不需要sprintf,而只需连接计数器和点。由于连接运算符也是一个点,

\n
rename -n -- \'our $c; s/\\d+\\./++$c . "."/e\' *.jpg\n
Run Code Online (Sandbox Code Playgroud)\n

笔记

\n

-n当确信其工作正常时将其删除。

\n

在某些发行版中rename可能称为perl-rename.

\n

our $c;引入是为了解决“全局符号“$c”需要显式包名称”错误。在我的系统中,没有必要... \xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf

\n