使用 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
假设我有一个文件夹,其中包含这样的文件:一个常量前缀,然后是一个下划线和一些对每个文件都不同的描述:
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