使用 bash 重命名一批特定文件

Rename batch of specific files using bash

假设我有一个文件夹,其中包含这样的文件:一个常量前缀,然后是一个下划线和一些对每个文件都不同的描述:

constantnamehere_description1.doc
constantnamehere_description2.doc
.
.
etc 

这里的description1,description2等只是符号化了不同的描述,并不是实际的数字1,2等。

如何将这些文件重命名为这个?

constantnamehere1.doc
constantnamehere2.doc
.
.
etc 

这里的数字 1,2,..,etc 代表我希望我的文件在重命名后具有的实际顺序结尾。 顺序结尾(1,2,3,...,end)非常重要。

到目前为止我已经尝试过:

for i in *.doc; do mv "$i" "{i/_*.doc/ .doc}"; done

示例实际文件名

1003407_cc_1.vtk
1003407_cc_2.vtk
1003407_cc_3.vtk
1003407_cv.left.right.vtk
1003407_thalamo_frontal.left.vtk

我想成为:

1003407_1.vtk
1003407_2.vtk
1003407_3.vtk
1003407_4.vtk
1003407_5.vtk

非常清楚:我希望在第一个下划线之后删除所有内容,并替换为保留文件扩展名“.vtk”的序列号

使用 Capturing Groups From a Grep RegEx 的答案,我们可以为这些文件名生成正则表达式,然后使用捕获的组重命名:

$ regex="([^_]*)_[^0-9]*([0-9]*).([a-z]*)"
$ for f in *doc
do 
    [[ $f =~ $regex ]]
    echo "mv $f --> ${BASH_REMATCH[1]}${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
done

正则表达式表示:获取 _ 之前的所有内容,然后期待一些字符,直到找到一个数字。抓住那组数字,然后期待一个点后跟扩展名。

使用rename:

i=1
for file in *_*.vtk
do 
  rename "s/_[^.]*/${i}/" "$file"
  i=$(( i + 1 ))
done

这将从匹配 *_*.vtk 模式的所有文件中删除下划线和第一个 . 之间的所有内容。如果您的文件名包含多个 .,则需要调整格式。

编辑:根据修改后的问题修改解决方案。

我是这样解决的:

i=0; 
for file in *.vtk; do mv "${file}" 100307_"${i}".vtk; i=$((i+1)); done