Bash脚本将常量添加到文件名中



我需要一个bash脚本来重命名目录中的文件。名称的格式为<name>_<number>(例如bob_12alice_233(。脚本必须将它们更改为<name>_<number+k>(例如,如果k=20、bob_32alice_253(。有人能帮忙吗?

$ ls
alice_253  bob_32
$ k=20
$ for old in *; do new=${old%_*}_$((${old#*_}+k)); mv "$old" "$new"; done
$ ls
alice_273  bob_52

不过这只是一个例子。如果有文件的名称为,它将无法正常工作

  • 破折号作为第一个字符
  • 除了一个以外的任意数量的下划线
  • 下划线右侧的非数字字符
  • 紧跟在下划线后面的零

如果我们也想涵盖这些情况,假设文件名可能不重叠(例如,当k=20时,foo_100foo_120,在这种情况下,我们需要先按相反的顺序对它们排序(,我们会这样做:

# handle -foo_123
# skip foo, foo_bar, foo_012,
# and foo_bar_123
k=20
for old in ./*_*; do
case $old in
(*_*_*) ;&
(*_*[!0-9]*) ;&
(*_0*) continue
esac
new=${old%_*}_$((${old#*_}+k))
mv "$old" "$new"
done