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

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

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

My vacation 2018-05-03 2345.jpg
My vacation 2018-05-03 2346.jpg
My vacation 2018-05-04 2347.jpg

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

My vacation 2018-05-03 0001.jpg
My vacation 2018-05-03 0002.jpg
My vacation 2018-05-04 0003.jpg

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

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

答案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'

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

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

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

或者

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

数字减去 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'

答案2

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

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

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

rename -n -- 'our $c; s/\d+\./++$c . "."/e' *.jpg

笔记

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

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

our $c;是为了解决'全局符号“$c”需要显式的包名称'错误。在我的系统中没有必要... ́\(ツ)/ ́

答案3

#!/usr/bin/env bash                                                                                                                     

#My vacation 2018-05-03 2345.jpg
#My vacation 2018-05-03 0002.jpg

cdir="${1}";
filename_start="${2}";

# For every file.
for cfilename in ${cdir}/*; do
    # If its index starts with a 0.
    if [[ "${cfilename}" =~ "${filename_start} "[0-9]*-[0-9]*-[0-9]*" "[0] ]]; then
        # Change its name.
        mv "${cfilename}" "${cfilename}_my_addition";
        fi
    done

然后您需要将此代码保存为文件。
给它 .sh 结尾。

授予它权限:

chmod 700 rename_files.sh;

然后你可以使用以下命令运行它:

./rename_files.sh;

答案4

除了所有建议的答案之外,我还发现了批量重命名功能双指挥官非常有用并且适合我的需要。

这是我的设置:

  • 我在文件名中添加一个计数器[N][C]
  • 我使用搜索和替换
    • 搜索:(\d{1,4})(\d{2,4})(\..{3,4}$)
    • 代替:$2$3
  • 您需要选中两个复选框正则表达式使用替换

即时预览是非常有用的功能,可以快速调整和控制文件的重新索引

相关内容