我正在尝试通过向具有匹配文件名的文件中添加序号来添加/修改文件名。我仍在学习,但是基于SO的大量帖子,我已经能够接近。问题是下面的代码不是根据匹配的文件名,而是向所有文件顺序添加数字。
e='t'
j=1
basename="$1"
newname="$2"
for f in "$basename"*.run?.t
do
echo mv -- "$f" "$newname${f#$basename%.run*.t}.run$((j++)).$e"
done
这是我文件的简化版:
1234.Gorilla_sub1.run1.t
1234.Gorilla_sub2.run1.t
1234.Gorilla_sub3.run1.t
1234.Gorilla_sub1.run2.t
1234.Gorilla_sub2.run2.t
4578.Gorilla_sub1.run1.t
4578.Gorilla_sub2.run1.t
我想要:
1234.Gorilla_sub1.run1.t
1234.Gorilla_sub2.run2.t
1234.Gorilla_sub3.run3.t
1234.Gorilla_sub1.run4.t
1234.Gorilla_sub2.run5.t
4578.Gorilla_sub1.run1.t
4578.Gorilla_sub2.run2.t
但是我上面的代码是这样做的:
1234.Gorilla_sub1.run1.t.run1.t
1234.Gorilla_sub2.run1.t.run2.t
1234.Gorilla_sub3.run1.t.run3.t
1234.Gorilla_sub1.run1.t.run4.t
1234.Gorilla_sub2.run1.t.run5.t
4578.Gorilla_sub1.run1.t.run6.t
4578.Gorilla_sub2.run2.t.run7.t
如何获取基于相同文件名前缀(1234.Gorilla,4578.Gorilla)的重新编号的方法?还替换运行吗?.t,而不是添加它?文件读取部分?如果有区别的话,我稍后会删除。 非常感谢!
答案 0 :(得分:0)
好吧,那么您应该在达到2后重设j。 使用您的代码:
e='t'
j=1
basename="$1"
newname="$2"
for f in "$basename"*.run?.t
do
echo mv -- "$f" "$newname${f#$basename%.run*.t}.run$((j++)).$e"
if (( j == 2 )); then
$(( j = 1 ));
fi;
done
答案 1 :(得分:0)
假设顺序很重要,请看下面这个可爱且可读性强的代码:
#!/usr/bin/env bash
declare -A a
shopt -s extglob nullglob
reg='_sub([0-9]+).run([0-9]+).t$'
for f in *_sub+([0-9]).run+([0-9]).t; do
[[ $f =~ $reg ]] && printf '%d %d %s\0' "${BASH_REMATCH[@]:1}" "$f"
done | sort -zn -k2,2 -k1,1 | cut -zd' ' -f3- |
while IFS= read -rd '' f; do
echo mv -- "$f" "${f%.*.t}.run$((++a[${f%_*}])).t"
done
试运行:
mv -- 1234.Gorilla_sub1.run1.t 1234.Gorilla_sub1.run1.t
mv -- 4578.Gorilla_sub1.run1.t 4578.Gorilla_sub1.run1.t
mv -- 1234.Gorilla_sub2.run1.t 1234.Gorilla_sub2.run2.t
mv -- 4578.Gorilla_sub2.run1.t 4578.Gorilla_sub2.run2.t
mv -- 1234.Gorilla_sub3.run1.t 1234.Gorilla_sub3.run3.t
mv -- 1234.Gorilla_sub1.run2.t 1234.Gorilla_sub1.run4.t
mv -- 1234.Gorilla_sub2.run2.t 1234.Gorilla_sub2.run5.t
如果对结果满意,请删除echo
。