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}
,并在末尾添加后缀计数器。
和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)
在文件名中,我们需要将后跟点 \xe2\x80\x94 \\d+.
\xe2\x80\x94 的数字序列替换为后跟点 \xe2\x80\x94 的 4-0 填充计数器sprintf("%04d.", ++$c)
。
rename -n -- \'our $c; s/\\d+\\./sprintf("%04d.", ++$c)/e\' *.jpg\n
Run Code Online (Sandbox Code Playgroud)\n对于没有零填充的情况,我们不需要sprintf
,而只需连接计数器和点。由于连接运算符也是一个点,
rename -n -- \'our $c; s/\\d+\\./++$c . "."/e\' *.jpg\n
Run Code Online (Sandbox Code Playgroud)\n笔记
\n-n
当确信其工作正常时将其删除。
在某些发行版中rename
可能称为perl-rename
.
our $c;
引入是为了解决“全局符号“$c”需要显式包名称”错误。在我的系统中,没有必要... \xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf