我有一个这样的目录:
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*