ubuntuusers.de

Hilfe bei Shellskript

Status: Gelöst | Ubuntu-Version: Ubuntu 12.10 (Quantal Quetzal)
Antworten |

Nookie

Avatar von 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

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Das geht auch ohne sed:

1
2
3
4
5
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

Avatar von 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 Team-Icon

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

Avatar von 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)
Avatar von Nookie

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)
Avatar von Nookie

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)
Avatar von Nookie

Anmeldungsdatum:
16. Mai 2010

Beiträge: 104

Wohnort: Ostschweiz

Ich bin offen für Verbesserungsvorschläge =)

user_unknown

Avatar von 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 Team-Icon

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/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

Antworten |