如何用计数重命名文件?

nki*_*int 5 bash rename batch-rename

我有一个这样的目录:

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
Run Code Online (Sandbox Code Playgroud)

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

randomized_quad0015.png
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么做。一些帮助?

Gil*_*il' 6

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
Run Code Online (Sandbox Code Playgroud)

如果你要重命名的文件都是三位数的话,还有更简单的方法,比如

rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png
Run Code Online (Sandbox Code Playgroud)

或者

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


Aes*_*sin 5

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

for i in randomized_quad???.png; do   
  mv $i randomized_quad0${i#randomized_quad}
done
Run Code Online (Sandbox Code Playgroud)

这将循环遍历数字区域中只有三个字符的文件名,大括号中的变量表达式采用每个文件名,从前面剪掉“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
Run Code Online (Sandbox Code Playgroud)