Grundlagen in der Batch-Verarbeitung[gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Grundlagen in der Batch-Verarbeitung[gelöst]

Beitrag von Tintom » 17.08.2006 20:30:25

Hallo,
zunächst einmal Entschuldigung für den wenig aussagekräftigen Threadnamen. Wusste nicht, wie ich es anders beschreiben sollte.
Also folgendes:

Ich habe eine private Homepage auf der ich meine Urlaubsbilder hochladen möchte. Die Urlaubsbilder haben den Dateinamen axxx.jpg, wobei xxx die eine fortlaufende Zahl sein soll. Zusätzlich sollen Thumbnails auf die "großen" Bilder verlinken, diese haben bei mir das Format akxxx.jpg. Bislang hab ich das immer per Hand noch gerade so geschafft, aber bei 200 MB an Bildern möchte ich mir das nicht zumuten. Ich habe mit imagemagick bereits testweise zwei jpg-Dateien, die bis auf die dreistellige Zahl identisch waren, mit convert konvertiert. Heraus kam folgendes

Code: Alles auswählen

derlynxx@debian-athlon:~/Desktop$ convert -resize 50x52! cimg*.jpg willi_*klein.jpg
derlynxx@debian-athlon:~/Desktop$ dir
cimg0126.jpg   willi_*klein.jpg.0
cimg0128.jpg   willi_*klein.jpg.1
Frage Nr.1: Wie bekomme ich eine Art Variable in den convert-Befehl ?

Frage Nr.2: Die dazugehörige HTML-Datei möchte ich auch nicht in mühevoller Handarbeit anlegen. Gibt es da mit Scripting auch Möglichkeiten den HTML-Code für eine bestimmte Anzahl von Bildern nach einem bestimmten Muster generieren zu lassen ?
Bei mir sieht das bpsw. so aus :

Code: Alles auswählen

<a href="http://www.unwichtig.de/a01.jpg" ><img src="http://www.unwichtig.de/ak01.jpg"></a>
Danke schonmal für eure Hilfestellungen

Gruß

Tino
Zuletzt geändert von Tintom am 18.08.2006 12:14:15, insgesamt 1-mal geändert.

Zwerg
Beiträge: 397
Registriert: 26.12.2005 00:10:09
Wohnort: Magrathea
Kontaktdaten:

Beitrag von Zwerg » 17.08.2006 20:36:35

Ich habe vor nen Jahr mal ein PHP Skript geschrieben was genau das macht. Wenn ich glück habe habe ich es noch auf meiner Platte. Ich schau mal nach!

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Beitrag von Tintom » 17.08.2006 22:03:08

zwerg2 hat geschrieben:Ich habe vor nen Jahr mal ein PHP Skript geschrieben was genau das macht. Wenn ich glück habe habe ich es noch auf meiner Platte. Ich schau mal nach!
Das wäre gut, weil ich hier nicht so richtig vorankomme :(

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 17.08.2006 22:11:15

Code: Alles auswählen

for datei in cimg*.jpg; do convert --resize 50x51! $datei willi_small${datei#cimg};done
Wenn du wirklich "willi_123small.jpg" statt "willi_small123.jpg" haben willst, wird es etwas komplizierter.

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Beitrag von Tintom » 17.08.2006 22:28:11

Joghurt hat geschrieben:

Code: Alles auswählen

for datei in cimg*.jpg; do convert --resize 50x51! $datei willi_small${datei#cimg};done
Wenn du wirklich "willi_123small.jpg" statt "willi_small123.jpg" haben willst, wird es etwas komplizierter.
Nein, nein !!

Gedacht habe ich mir das so: die Originalbilder sollen auf 1024x768 Pixel konvertiert werden und die Namensgebung axxx.jpg haben, wobei xxx bei 001 beginnt und dann beim letzten Bild (z.B. 238) aufhört. Die kleinen Thumbnails sollen aus den großen Bildern auf 50x52 Pixel konvertiert werden, das Namensformat akxxx.jpg haben und von der fortlaufenden Nummer identisch sein. Wenn das gehen würde, wäre mir schon viel geholfen !

Gruß

Tino

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 17.08.2006 23:58:29

Code: Alles auswählen

#!/bin/bash
n=0
for name in $1/*.jpg; do
  echo "$name -> a${N}.jpg"
  N=$(printf "%03i" $n)
  convert --resize 1024x768 $name a${N}.jpg
  convert --resize 50x52 $name ak${N}.jpg
  n=$((n+1))
done
Aufruf mit

Code: Alles auswählen

./skript /verzeichnis/wo/bilder/liegen
Es erstellt dann im aktuellen Verzeichnis die gewünschten Bilder.
Verzeichnis mit den Quellbildern und aktuelles Verzeichnis dürfen nicht identisch sein. Desweiteren dürfen die Namen keine Leerzeichen enthalten (sonst for name in ...; do durch ls $1/*.jpg|while read name; do ersetzen)
Zuletzt geändert von Joghurt am 18.08.2006 00:04:01, insgesamt 2-mal geändert.

Zwerg
Beiträge: 397
Registriert: 26.12.2005 00:10:09
Wohnort: Magrathea
Kontaktdaten:

Beitrag von Zwerg » 18.08.2006 00:02:30

Gut das ihr es hinbekommen habt, ich scheine das Skript auch nicht mehr zu haben :( - man sollte echt aufpassen was man löscht - allerdings will ich auch nicht zum HDD Messi werden :)

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Beitrag von Tintom » 18.08.2006 12:11:49

Joghurt hat geschrieben:

Code: Alles auswählen

#!/bin/bash
n=0
for name in $1/*.jpg; do
  echo "$name -> a${N}.jpg"
  N=$(printf "%03i" $n)
  convert --resize 1024x768 $name a${N}.jpg
  convert --resize 50x52 $name ak${N}.jpg
  n=$((n+1))
done
Aufruf mit

Code: Alles auswählen

./skript /verzeichnis/wo/bilder/liegen
Es erstellt dann im aktuellen Verzeichnis die gewünschten Bilder.
Verzeichnis mit den Quellbildern und aktuelles Verzeichnis dürfen nicht identisch sein. Desweiteren dürfen die Namen keine Leerzeichen enthalten (sonst for name in ...; do durch ls $1/*.jpg|while read name; do ersetzen)
Wunderbar, besten Dank !!! :D

Das Script läuft nach anfänglichem Murren (die Option muss -resize heißen) bei mir fehlerfrei.
Kannst Du mir die Stelle

Code: Alles auswählen

N=$(printf "%03i" $n)
sowie

Code: Alles auswählen

n=$((n+1))
noch einmal genau erklären ? Also was dort abläuft ? Sonst ist mir der restliche Code klar.

Danke und Gruß

Tino

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 18.08.2006 12:31:53

Tintom hat geschrieben:

Code: Alles auswählen

N=$(printf "%03i" $n)
Formatierte Ausgabe einer Zahl, siehe

Code: Alles auswählen

man printf
$n ist der Zähler, für n=1 wird N dann die Zeichenfolge 001, für n=2 002 usw.
Kannst auch mal auf der Konsole probieren.

Code: Alles auswählen

printf "%03i" 1
printf "%03i" 2
Tintom hat geschrieben:

Code: Alles auswählen

n=$((n+1))
$n um eins hochzählen.
MfG GoKi
:wq

Antworten