假设我有一个包含这样的文件的文件夹:一个常量前缀,然后是一个下划线和一些描述,对于每个文件都是不同的:
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"文件的扩展名
答案 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