Shell - 如何在文件名中间重命名文件?

Shell - 如何在文件名中间重命名文件?

我必须调整图像大小,并想动态重命名它们,名称如下

  • Compet-210-123456.jpg
  • Compet-210-123457.jpg
  • ...
  • Compet-211-123555.jpg 和

我想注射4K两个数字之间

  • Compet-211-4K-123555.jpg

目前我只知道添加4K结尾如下:

for img in ./Compet-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9].jpg do; 
  convert "$img" -resize "3840x2160^" \
                 -gravity center \
                 -crop 3840x2160 \
                 "${img%.jpg}-4k.jpg"
done 

答案1

根据原始文件名,有时可以精确修剪不需要的部分:

head=${img%-*.jpg}
tail=${img#./Compet-*-}
newimg=$head-4k-$tail

另一种方法是使用正则表达式匹配=~

re='^\./(Compet-[0-9]+)-([0-9]+\.jpg)$'
if [[ $img =~ $re ]]; then
    newimg=${BASH_REMATCH[1]}-4k-${BASH_REMATCH[2]}
    convert "$img" ... "$newimg"
fi

Bash 使用“POSIX 扩展正则表达式”正则表达式语法,并且捕获组放在 BASH_REMATCH 数组中。

我使用一个变量来保存正则表达式模式,因为否则右侧的引用/转义规则[[ ]]可能会变得有点难看。

相关内容