如何重命名带有计数的文件?

如何重命名带有计数的文件?

我有一个这样的目录:

randomized_quad015.png
randomized_quad030.png
randomized_quad045.png
randomized_quad060.png
randomized_quad075.png
randomized_quad090.png
randomized_quad1005.png
randomized_quad1020.png
randomized_quad1035.png
randomized_quad1050.png
randomized_quad105.png
randomized_quad1065.png
randomized_quad1080.png
randomized_quad1095.png
randomized_quad1110.png
randomized_quad1125.png
randomized_quad1140.png

我想重命名第一个文件并在数字前面添加 0,例如:

randomized_quad0015.png

但我不知道该怎么做。能帮忙吗?

答案1

rename是一个命令行工具,可以让你使用Perl命令来转换名称。在这种情况下常用的 Perl 命令是s/REGEXP/REPLACEMENT/

如果我正确理解了您的问题,您需要在少于 4 位数字的名称中添加前导 0,以便所有名称最终都有 4 位数字。这个稍微复杂的表达式处理文件名包含 1、2 或 3 位数字的一般情况:它将所有文件名对齐为 4 位数字。e末尾的修饰符使替换被解释为 Perl 表达式而不是字符串。此表达式重复数字0多次,以将数字填充为 4 位数字。

rename 's/(?=([0-9]+)\.)/"0" x (4 - length($1))/e' *.png

如果要重命名的文件都有三位数,则有更简单的方法,例如

rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png

或者

rename 's/(?<=[^0-9])[0-9]{3}\./0$&/' *.png

答案2

作为其他答案中各种基于 Perl 的方法的替代,您可以执行这个特定示例以及许多其他类似的示例bash

for i in randomized_quad???.png; do   
  mv $i randomized_quad0${i#randomized_quad}
done

这将循环遍历数字区域中只有三个字符的文件名,并且括号中的变量表达式取出每个文件名,从前面剪掉“randomized_quad”(使用 # 运算符),并在前面添加“randomized_quad0”。

其他令人兴奋的、有用的运算符包括:

  • %- 剪掉结尾的部分
  • /- 搜索和替换(/针对第一个匹配项、//针对所有匹配项)
  • :- 用于提取子字符串

带有示例的更完整列表是这里。另外,请注意,这些使用 POSIX 样式的正则表达式,因此.将匹配任何字符,而不仅仅是“。”如果要匹配“。”,则应使用反斜杠“转义”它:

TestVariable1="filename.png"
TestVariable2="filename0png"

echo "${TestVariable1%.png}"
> filename

echo "${TestVariable2%.png}"
> filename

echo "${TestVariable1%\.png}"
> filename

echo "${TestVariable2%\.png}"
> filename0png

答案3

使用较新版本的 bash 你可以这样写:

for f in randomized_quad*.png; do
    if [[ $f =~ [1-9][0-9]* ]]; then
        new=$(printf "randomized_quad%04d.png" ${BASH_REMATCH[0]})
        [[ $f != $new ]] && mv -v $f $new
    fi
done

答案4

rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*

相关内容