tingeltobi
Anmeldungsdatum: 11. Januar 2010
Beiträge: 55
|
Guten Tag,
ich habe eine Schleife welche Logdatein erzeugt.
Diese Logdateien möchte ich mit eine Zahl benennen.
Die Formatierung soll 001, 002 ... usw. sein.
Mit der Schleife:
x='1'
for line in * do
befehl > $x-Logdatei.log
((x++))
done
Wie bekomme ich den Namen der Logdatei so hin dass die Zahl des Zählers drei Stellen hat? Gruß tingeltobi
|
Krokau
Anmeldungsdatum: 5. März 2011
Beiträge: Zähle...
|
| x='1'
for line in * do
y=$(prinf '%03d' $x)
befehl > $y-Logdatei.log
((x++))
done
|
so sollt es funktionieren
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Ich glaub, sowas ginge auch: | #!/usr/bin/env bash
declare -i \
x= \
y=
for line in ./*
do
printf -v y '%03d-Logdatei.log' "$((++x))"
befehl >./${y} 2>&1
done
|
:
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Krokau schrieb: | x='1'
for line in * do
y=$(prinf '%03d' $x)
befehl > $y-Logdatei.log
((x++))
done
|
so sollt es funktionieren
Da fehlt ein "t". Der Befehl heißt printf . ☺ Man kann die Process Substitution auch direkt bei der Umleitung machen. Ich finde allerdings die Benennung der Variable "line" etwas irreführend, denn sie beinhaltet ja Dateinamen. Außerdem taucht die nirgendwo auf, wozu braucht man sie dann? Ciao robert
|
tingeltobi
(Themenstarter)
Anmeldungsdatum: 11. Januar 2010
Beiträge: 55
|
Könnte man nicht drei 000 irgendwie ersetzen.
So wie in dem folgenden Beispiel:
x='1'
dotSTR="..........."
echo -e "${x}${dotSTR:${#x}}"
bloß das x nicht links sondern rechts steht? @robert: Die Schleife sollte nur ein Beispiel sein.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
rklm schrieb: Man kann die Process Substitution auch direkt bei der Umleitung machen.
Ich glaub, Du meintest es so rum: statt Command Substitution könnte man eine Process Substitution bei der Umleitung machen. – In bash fänd ich ein "weder noch" besser wegen zusätzlicher Subshells
|
tingeltobi
(Themenstarter)
Anmeldungsdatum: 11. Januar 2010
Beiträge: 55
|
Hallo rkml,
ich verstehe deine Antwort nur Teilweise da ich noch ein Anfänger bin.
Das folgende Beispiel hat auch funktioniert.
x='1'
NULL="000"
touch "${NULL:${#x}}${x}"-Logdatei.log
ich würde es aber vorziehen keine neue Variable zu definieren und die drei 000 irgendwie direkt in die letzte Zeile zu schreiben. Gruß tingeltobi
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
D630 schrieb: rklm schrieb: Man kann die Process Substitution auch direkt bei der Umleitung machen.
Ich glaub, Du meintest es so rum: statt Command Substitution könnte man eine Process Substitution bei der Umleitung machen.
Nein, das meinte ich nicht. Ich hatte nur "Process Substitution" und "Command Substitution" verwechselt. Im Moment haben wir Command Substitution Parameter Expansion
Ich schlage vor, die Variable wegzulassen und stattdessen die Command Substitution direkt bei der Umleitung anzubringen. | x=1
for line in *; do
befehl > "$(printf '%03d' $x)-Logdatei.log"
# oder auch:
# befehl > "$(printf '%03d-Logdatei.log' $x)"
((x++))
done
|
Übrigens fehlte da noch ein Semikolon vor dem do .
– In bash fänd ich ein "weder noch" besser wegen zusätzlicher Subshells
Du meinst, printf -v var zu nutzen. OK, kann man machen. Da das einen Prozess spart, hat das eine gewisse Berechtigung. "-v" kannte ich noch gar nicht. Danke für den Hinweis! Wozu hast Du denn den declare eingebaut? Ich sehe da keinen Vorteil in diesem Fall. Ciao robert
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
tingeltobi schrieb: Hallo rkml,
ich verstehe deine Antwort nur Teilweise da ich noch ein Anfänger bin.
Das folgende Beispiel hat auch funktioniert.
x='1'
NULL="000"
touch "${NULL:${#x}}${x}"-Logdatei.log
ich würde es aber vorziehen keine neue Variable zu definieren und die drei 000 irgendwie direkt in die letzte Zeile zu schreiben. Gruß tingeltobi
Dies ginge auch, und kommt sogar ohne weiterem builtin-Befehl aus. Allerdings: mit der Variable "NULL" hast Du dann doch auch eine zweite Variable definiert, nur dass diese nicht überschrieben wird?!
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
rklm schrieb: D630 schrieb: rklm schrieb: Man kann die Process Substitution auch direkt bei der Umleitung machen.
Ich glaub, Du meintest es so rum: statt Command Substitution könnte man eine Process Substitution bei der Umleitung machen.
Nein, das meinte ich nicht. Ich hatte nur "Process Substitution" und "Command Substitution" verwechselt. Im Moment haben wir Command Substitution Parameter Expansion
Ich schlage vor, die Variable wegzulassen und stattdessen die Command Substitution direkt bei der Umleitung anzubringen. | x=1
for line in *; do
befehl > "$(printf '%03d' $x)-Logdatei.log"
# oder auch:
# befehl > "$(printf '%03d-Logdatei.log' $x)"
((x++))
done
|
Übrigens fehlte da noch ein Semikolon vor dem do .
– In bash fänd ich ein "weder noch" besser wegen zusätzlicher Subshells
Du meinst, printf -v var zu nutzen. OK, kann man machen. Da das einen Prozess spart, hat das eine gewisse Berechtigung. "-v" kannte ich noch gar nicht. Danke für den Hinweis! Wozu hast Du denn den declare eingebaut? Ich sehe da keinen Vorteil in diesem Fall. Ciao robert
Achso. Die Option -v ist aber nicht POSIX-konform... Die Deklaration hat keinen technischen Vorteil, denk ich; sie ist für mich aber gute Praxis (lass ich hier im Forum aber meistens weg; in diesem Fall mal nicht) Edit:
Ich meine, die Deklaration in diesem Beispiel hat keinen Vorteil. Und generell ist sie für mich gute Praxis.
|
tingeltobi
(Themenstarter)
Anmeldungsdatum: 11. Januar 2010
Beiträge: 55
|
Vielen Dank für eure Hilfe
und Vorschläge.
Ich verwende jetzt:
$(printf '%03d' $x)-Logdatei.log Herbstliche Grüße tingeltobi
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
D630 schrieb:
Achso. Die Option -v ist aber nicht POSIX-konform...
Wenn Du es POSIX-konform haben willst (wenn es also in der sh bzw. dash laufen können soll), dann müssen wir auch noch das Inkrementieren von "x" ändern: | x=1
for line in *; do
befehl > "$(printf '%03d-Logdatei.log' $x)"
x=$((x + 1)) # für POSIX
done
|
Ciao robert
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
tingeltobi schrieb: Vielen Dank für eure Hilfe
und Vorschläge.
Ich verwende jetzt:
$(printf '%03d' $x)-Logdatei.log Herbstliche Grüße tingeltobi
Ok. Macht aber, wie erwähnt, eine zusätzliche Subshell.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
rklm schrieb: Wenn Du es POSIX-konform haben willst ...
| x=1
for line in *; do
befehl > "$(printf '%03d-Logdatei.log' $x)"
x=$((x + 1)) # für POSIX
done
|
In der Richtung (allerdings nur für die bash) gibt es noch einen anderen hübschen Trick: | x=001
for line in *; do
befehl > "${x: -3}-Logdatei.log" # Parameter Expansion lässt nur die letzten 3 Zeichen von $x stehen
x=10#00$((x + 1)) # Zwangs-Dezimalzahl, auch mit führenden Nullen
done
|
Ok, man könnte genau so gut auch ab 1000 zählen und dann vorne abschneiden ... 🦆 LG, track
|