
Ich möchte, dass mein Skript aus einer Liste neuer Namen liest und dann eine neue Datei unter einem neuen Namen speichert, der aus den ersten drei Buchstaben des Dateinamens plus einem Zähler besteht, der für jede Datei, die mit denselben drei Buchstaben beginnt, eins hinzufügt.
Angenommen, dies sind meine alten und neuen Dateinamen-
Liste der Dateinamen: A77 A77 A77 A78 A78
listofNewNames: A7701 A7702 A7703 A7801 A7802 (prospektiv, listofNewNames soll nicht gespeichert werden)
COUNTER=0
for i in listofFileNames; do
while [$COUNTER -lt 5]
let "COUNTER=COUNTER+01"
done
newName=${oldfilename}${COUNTER}.L2_LAC_OC
done
Das ist soweit alles, was ich habe, aber jedes Mal, wenn sich die Buchstaben ändern, muss der Zähler wieder bei 0 anfangen, so dass die Länge der Dateinamen nie 5 beträgt. Sie beträgt beispielsweise 3 und dann 2, abhängig von der Anzahl der Dateien.
Ich hoffe, ich habe mich klar ausgedrückt. Vielen Dank im Voraus.
Antwort1
last_name=""
listofFileNames=(A77 A77 A77 A78 A78)
for name in "${listofFileNames[@]}"; do
test "$name" != "$last_name" && COUNTER=1
last_name="$name"
printf "%s%02d\n" "${name}" "${COUNTER}"
((COUNTER++))
done
Antwort2
Sieh dir das an:
ListOfFiles=("A77" "A77" "A77" "A78" "A78")
for oldfile in "${ListOfFiles[@]}"; do
COUNT=1;
while [[ -f "$(printf "%s%02d" ${oldfile} ${COUNT})" ]]; do
COUNT=$(($COUNT + 1))
done
echo "NewName: $(printf "%s%02d" ${oldfile} ${COUNT})"
touch "$(printf "%s%02d" ${oldfile} ${COUNT})"
done
Im Moment gibt das Skript Dateinamen wie
NewName: A7701
NewName: A7702
NewName: A7703
NewName: A7801
NewName: A7802