добавить имена файлов, совпадающие с порядковыми номерами - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь добавить / изменить имена файлов, добавив последовательные номера к файлам, которые имеют совпадающие имена файлов. Я все еще учусь, но на основе ряда сообщений от 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 голосов
/ 04 сентября 2018

Предполагая, что порядок важен, взгляните на этот прекрасный и хорошо читаемый код:

#!/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, если вы удовлетворены результатом.

0 голосов
/ 01 сентября 2018

Ну, тогда вы должны сбросить j после достижения 2. Используя ваш код:

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
...