• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Shell Script Aktion für viele Dateien

Hallo Linux Gemeinde,
ich habe vor auf meinem Server via ImageMagick etwa 300MB Bilder mit einem Copyright zu versehen.

Da das IM Script pro Aufruf nur ein Bild bearbeitet muss ich das ganze in ein Shellscript packen und ausführen.

Leider hab ich keinen Ansatz wie ich die Dateien aus dem Ordner öffnen, bearbeiten, abspeichern soll.

Es sind etwa 500 Bilder welche fortlaufend mit Zahlenkombinationen am Dateinamenende versehen sind.

Könnte mir ein Shellprofi ein Denkanstoss zur Stapelverarbeitung geben.

Code:
garage_gallery-1-1092776237_thumb.jpg
garage_gallery-1-1093888768.jpg
garage_gallery-1-1093888768_thumb.jpg
garage_gallery-1-1107383351.jpg
garage_gallery-1-1107383351_thumb.jpg
garage_gallery-1-1109932151.jpg
garage_gallery-1-1109932151_thumb.jpg
garage_gallery-10-1092221318.jpg
garage_gallery-10-1092221318_thumb.jpg
garage_gallery-10-1095163296.jpg
garage_gallery-10-1095163296_thumb.jpg

Bearbeitet sollen nur die großen Bilder werden. Nicht die Thumps.
Bin für einen Lösungsvorschlag sehr dankbar!

mfG
Kosta
 
Tipp:

find -exec

Mit find kannst du dir eine bestimmte Menge von Dateien "liefern" lassen, die du dann jeweils mit der Aktion, die bei exec angegeben ist, bearbeitest. Das kann man wie eine Schleife über eine Anzahl von Dateien sehen.

find selbst versteht recht viele Parameter, mit denen du die Dateien "auswählen" kannst, bei dir empfiehlt sich da evtl. der Einsatz des "regex pattern", damit kannst du deine Thumbs ausschließen.

Die Action "exec" ist ein wenig tricky (Klammern, Anführungszeichen und Strichpunkt :) ), probier ruhig mal und sag hier Bescheid wie du es gelöst hast, oder ob du weitere Hilfe brauchst.

Beschreibung zu find (wie immer):

man find
 
Hi scg, der Tipp war schonmal gut 8)

Hab jetzt mal was versucht und es scheint zu funktionieren:

Code:
find . -name "garage_gallery-[0-9]*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].jpg"

Das gibt mir nun die Dateien der Reihe nach aus.

Code:
./garage_gallery-155-1114284166.jpg
./garage_gallery-155-1114284199.jpg
./garage_gallery-155-1114284265.jpg
./garage_gallery-167-1114336947.jpg
./garage_gallery-54-1114287249.jpg
./garage_gallery-167-1114337031.jpg

Nun muss ich sie aber der Reihe nach verarbeiten. Habe allerdings keine Idee wie ich das Schritt für Schritt lösen könnte.

Folgende Aktion muss pro Bild einmal ausgeführt werden:

Code:
composite -gravity SouthWest copy.png $bilddatei $bilddatei

$bilddatei ist die zu verarbeitende datei, welche nach dem composite die Ausgangsdatei mit der Enddatei überschreibt.

Ich denke hier werd ich ein paar Codesnipsel benötigen.
 
Code:
find . -name "garage_gallery-[0-9]*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].jpg"
 | xargs composite -gravity SouthWest copy.png

sollte gehen :)

oder du schreibts für deine "Verarbeitung" ein kleines script und rufst das via xargs auf
 
schade so einfach funktioniert das leider nicht :(

composite braucht die dateiangabe als parameter übergeben.

composite -gravity SouthWest copy.png $originalbild $fertigesbild

allerdings soll das fertige bild den selben namen haben wie das originalbild, also überschreiben. habe jedoch keine ahnung wie ich die liste der dateien, welche mir find gibt in ein script umsetze.

in C++ würde man die Liste in ein Array laden und dann beim ersten anfangen und jede Aktion pro Member im Array ausführen. Nur wie sieht der Shell Syntax aus?
 
Code:
#!/bin/bash

function convert()
{
source=$1
target=$1
composite -gravity SouthWest copy.png $source $target
}

liste=`find . -name "garage_gallery-[0-9]*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].jpg"` 

for i in $liste; do
    convert "$i"
done

du kannst aber auch das Programm kim (eine Konqueror-Erweiterung) dafür verwenden:
http://ftp.gwdg.de/pub/linux/suse/apt/SuSE/9.2-i386/RPMS.suser-oc2pus/kim-0.7-0.oc2pus.2.noarch.rpm
http://ftp.gwdg.de/pub/linux/suse/apt/SuSE/9.1-i386/RPMS.suser-oc2pus/kim-0.7-0.oc2pus.2.noarch.rpm
http://ftp.gwdg.de/pub/linux/suse/apt/SuSE/9.2-i386/RPMS.suser-oc2pus/kim-plugins-0.7-0.oc2pus.2.noarch.rpm
http://ftp.gwdg.de/pub/linux/suse/apt/SuSE/9.1-i386/RPMS.suser-oc2pus/kim-plugins-0.7-0.oc2pus.2.noarch.rpm
geht auch für andere SuSE, da noarch-RPM

EDIT: for schleifen-Syntax korrigiert
 
so, habe es eben getest. bekomme allerdings eine fehlermeldung.

habe dann vorsichtshalber mal convert durch conv ersetzt, da es ein pogramm convert gibt.

allerdings selbe fehlermeldung.
shell im "debug"-modus bringt mich auch nicht weiter:

Code:
#!/bin/bash -x

function conv()
{
source=$1
target=$1
composite -gravity SouthWest copy.png $source $target
}

liste=`find . -name "garage_gallery-[0-9]*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].jpg"`
for i in $liste do;
conv "$i"
done

:arrow:

Code:
./conv.sh: line 12: syntax error near unexpected token `conv'
./conv.sh: line 12: `conv "$i"'

BTW: Ist ein SuSe 9.0 System ohne KDE, als geht leider kein Konquerer Plugin ;)
 
ausgezeichnet, es funktioniert :D

herzlichen dank :!:

jetzt kann ich alle Bilder in meinem Bikeforum mit der URL versehen.

wens interessiert: http://r6club.de/index.php?act=Garage :)
 
Oben