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

时间:2015-03-04 15:00:22

标签: macos bash file rename

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

constantnamehere_description1.doc
constantnamehere_description2.doc
.
.
etc 

这里的description1,description2等只是象征着不同的描述,而不是实际的数字1,2等。

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

constantnamehere1.doc
constantnamehere2.doc
.
.
etc 

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

直到现在我已经尝试过:

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"文件的扩展名

3 个答案:

答案 0 :(得分:1)

使用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

正则表达式说:将所有内容都升级到_,然后在找到一个数字之前预期一些字符。抓住那组数字然后期望一个点后跟扩展名。

答案 1 :(得分:1)

使用rename

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

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

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

答案 2 :(得分:1)

我解决了这个问题:

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