Nookie
Anmeldungsdatum: 16. Mai 2010
Beiträge: 104
Wohnort: Ostschweiz
|
Hallo Ich arbeite zurzeit an einem kleine Shellskript bei welchem ich nicht besonders vorwärts komme ☹ Ich habe in der variable $string folgenden string "1454x1091+0+0" Okay, nun möchte ich gerne alles inklusive dem "+" Zeichen abschneiden damit ich noch
1454x1091 habe. Danach sollen diese beiden Werte zusammengezählt werden. Ich denke dafür braucht man sed mit dem ich mich leider kaum auskenne. Kann mir wer helfen?
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2510
|
Servus, schau’ dir mal Parameter Expansion an:
Und Arithmetic Expansion:
Damit solltest du die Aufgabe lösen können. ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
Das geht auch ohne sed:
| s="1454x1091+0+0"
echo ${s}
1454x1091+0+0
echo ${s/+*/}
1454x1091
|
|
xuniL123
Anmeldungsdatum: 5. August 2012
Beiträge: 293
|
So gehts auch:
echo $string | cut -d'+' -f1 | tr 'x' '+' | bc
2545
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
xuniL123 schrieb: So gehts auch:
echo $string | cut -d'+' -f1 | tr 'x' '+' | bc
2545
Und wieso transformierst Du ein Mal in ein Plus, und rechnest es aus? ☺ Das ist doch eine Bildgröße bzw. Auflösung.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13219
|
user unknown schrieb: Und wieso transformierst Du ein Mal in ein Plus, und rechnest es aus? ☺
Vermutlich deshalb: Nookie schrieb: Danach sollen diese beiden Werte zusammengezählt werden.
Ciao robert
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
rklm schrieb: Nookie schrieb: Danach sollen diese beiden Werte zusammengezählt werden.
Tatsache! Ich bin irritiert.
|
Nookie
(Themenstarter)
Anmeldungsdatum: 16. Mai 2010
Beiträge: 104
Wohnort: Ostschweiz
|
Super vielen dank Leute!
Konnte mein script zu Ende schreiben. Und ja, das zusammenzählen war Absicht ☺
|
xuniL123
Anmeldungsdatum: 5. August 2012
Beiträge: 293
|
user unknown schrieb: rklm schrieb: Nookie schrieb: Danach sollen diese beiden Werte zusammengezählt werden.
Tatsache! Ich bin irritiert.
Ich auch, denn der Grund hierfür erschließt sich mir auch nicht ☺
|
Nookie
(Themenstarter)
Anmeldungsdatum: 16. Mai 2010
Beiträge: 104
Wohnort: Ostschweiz
|
Es ging darum Bilder mit einer kleinen Auflösung auszusortieren.
Ich habe ein Archiv mit ca 800'000 Bilder und ich wollte alle Bilder mit einer geringen Auflösung los werden. Darum habe ich die werte der Länge unter der Breite addiert und wenn der Wert unter 2000 war das Bild verschoben. oder hättet ihr das anders gemacht? ☺ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | #!/bin/bash
for i in `seq 100000 800000`
do
if (test -f $i.jpg)
then
export string=$(identify -verbose $i.jpg | grep Geometry:)
export string=$(echo $string | cut -b 11-100)
export string=$(echo $string | cut -d'+' -f1 | tr 'x' '+' | bc)
if [ $string -lt 2000 ]
then
rm $i.*
echo "$i.jpg hat eine geringe Auflösung! Datei wurde gelöscht!"
fi
else
echo "$i.jpg ist nicht vorhanden!"
exec 3>&2 2>/dev/null
rm $i.*
exec 2>&3 3>&-
fi
done
|
wahrscheinlich ist das alles sehr unsauber aber es hat seine Zweck erfüllt ☺
|
xuniL123
Anmeldungsdatum: 5. August 2012
Beiträge: 293
|
Wäääh, bei dem "Programmierstil" sträuben sich selbst mir die Haare, aber Hauptsache es hat funktioniert^^.
|
Nookie
(Themenstarter)
Anmeldungsdatum: 16. Mai 2010
Beiträge: 104
Wohnort: Ostschweiz
|
Ich bin offen für Verbesserungsvorschläge =)
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
2000 ist evtl. die Summe aus 1000 und 1000. 1000 * 1000 ist 1 Million. 1500 + 500 ist auch 2000, aber das Produkt ist 750 000. Die Bildgröße in Pixeln ist jedenfalls das Produkt und nicht die Summe. Wenn die Bilder aber alle Proportionen zwischen 3x4 und 4x3 haben oder ähnlich, also nicht zu weit von quadratischen Verhältnissen entfernt sind, und die Grenze ohnehin willkürlich gewählt ist, reicht auch die Summe.
|
xuniL123
Anmeldungsdatum: 5. August 2012
Beiträge: 293
|
Nookie schrieb: Ich bin offen für Verbesserungsvorschläge =)
for i in `seq 100000 800000`
würde ich eher so schreiben:
for i in {100000..800000} Aber besser wäre es, gleich über die vorhandenen .jpg-Dateien zu iterieren, dann sparst du dir ein unnötiges if:
for JPG in *.jpg; do
...
done
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13219
|
Weitere Verbesserungsvorschläge: ordentliches Quoting spar Dir den exec oberhalb und unterhalb von rm - das kann man einfacher haben der wiederholte export bringt nix die Variable "string" muss aber gar nicht exportiert werden, weil Du sie nur innerhalb des Skriptes brauchst Du kannst identify besser benutzen
Also:
| #!/bin/bash
for f in *.jpg; do
geo=($(identify -format '%w %h' "$f"))
pix=$((geo[0] * geo[1]))
if [ $pix -lt 1000000 ]; then
rm "$f" && echo "$f hat eine geringe Auflösung! Datei wurde gelöscht!"
fi
done
|
Ciao robert
|