附加与序号匹配的文件名

时间:2018-09-01 02:06:02

标签: bash rename string-matching sequential

我正在尝试通过向具有匹配文件名的文件中添加序号来添加/修改文件名。我仍在学习,但是基于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,而不是添加它?文件读取部分?如果有区别的话,我稍后会删除。 非常感谢!

2 个答案:

答案 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