Zähler inkrementieren

14/12/2010 - 11:01 von Fr | Report spam
[GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)]

Hallo zusammen,

wollte gerade auf die Schnelle einen Schwung JPEGs umbenennen,
wobei folgende Namenskonvention gilt:

Gegeben:
kon-stanter-text-zufallszahl.jpg

Gewünscht:
kon-stanter-text-[01,02,...,99].jpg

also die "zufallszahl" jeweils durch einen fortlaufenden Zàhler ersetzen.
Als Einzeiler flutschte folgendes Konstrukt aus meinen Fingern:

# Beispiel-1
# -
i=1; for f in *jpg; do \
mv "$f" "$(echo $f | cut -d- -f1-3)-$(printf "%02g" ${i}).jpg"; \
$((i++)); \
done

Zuvor mit "echo mv ..." getestet, dann ausgeführt und es funktionierte
wie gewünscht. Sowohl beim Testlauf als auch beim wirklichen Umbenennen
veranlasste meine Zàhlerinkrementierung aber die Fehlermeldung:

1: Befehl nicht gefunden
...
99: Befehl nicht gefunden

Alternativ probierte ich noch folgende Ansàtze:

# Beispiel-2
# -
i=1; for f in *jpg; do \
mv "$f" "$(echo $f | cut -d- -f1-3)-$(printf "%02g" $((i++))).jpg"; \
done

# Beispiel-3
# -
i=1; for f in *jpg; do \
mv "$f" "$(echo $f | cut -d- -f1-3)-$(printf "%02g" ${i}).jpg"; \
i=`expr $i + 1`; \
done

Klar, in Beispiel-1 wird "$((i++))" als Kommando aufgefasst anstelle
als schlichte Inkrementierung.

In Beispiel-2 wird "$i" nicht inkrementiert, vermutlich weil es in der
für jeden Schleifendurchlauf neu erzeugten printf-Subshell verwendet
wird.

In Beispiel-3 habe ich das mir seit Urzeiten bekannte expr-Konstrukt
verwendet, um "$i" zu inkrementieren. Ich wusste vorher, dass es so
geht, aber ich wollte weniger schreiben und "$((i++))" ist ja auch
schnell und elegant getippt.

Okay ... nun habe ich *wesentlich* mehr getippt, als ich ursprünglich
vorhatte ;-)

Fazit
Ich würde jetzt gerne begreifen:

* Wieso wird "$((i++))" in Beispiel-1 als Kommando aufgefasst?
Ist das BASH-Definition?

* Wieso funktioniert '$(printf "%02g" $((i++)))' in Beispiel-2
nicht? Ich vermute wegen der "$(printf ...)" Subshell?

Danke, wenn sich mal jemand die Zeit nimmt - es eilt aber nicht,
weil mein winziges Problemchen ja nun gelöst ist und ich jederzeit
mit der `expr ...` Konstruktion leben kann :-)

Viele Grüße aus den eisigen, tief verschneiten Alpen,
Frank
 

Lesen sie die antworten

#1 Norbert Moendjen
14/12/2010 - 12:36 | Warnen spam
wrote:

# Beispiel-1
# -
i=1; for f in *jpg; do \
mv "$f" "$(echo $f | cut -d- -f1-3)-$(printf "%02g" ${i}).jpg"; \
$((i++)); \
done



$((i++)) steht alleine in einer Zeile und wird mit dem Ergebnis der
Substitution ersetzt, was soll jetzt die bash mit z.B. der Substitution 23
anfangen. Wenn dann:
i=$((i++))

Ciao Nobbe

Ähnliche fragen