Inkscape, mehrere Bilder konvertieren, aber...

S4sh :D

Neuling
Thread Starter
Mitglied seit
16.05.2007
Beiträge
399
Ort
NRW
Guten Morgen zusammen!

Wie der Titel schon sagt, will ich mit Inkscape mehrere Bilder konvertieren, die alle in einer Verzeichnisstruktur stecken. Genauer gesagt, sind das alle .svg unterhalb von /usr/share/icons. Dieses habe ich mir in mein /home kopiert, um dort erstmal konvertieren zu können.
Generell ist/wäre das ja kein Problem:

Code:
#!/bin/bash

for ICON in `find . -iname '*.svg'`
do
   echo "converting picture "$ICON""
   inkscape -f "$ICON" --verb=org.inkscape.color.grayscale --verb=FileSave --verb=FileClose
done

Blöderweise habe ich aber schon bemerkt, dass Inkscape sich bei einigen Bildern aufhängt. Ich will diesen Job über Nacht laufen lassen, und kann einzelne Konvertierungsjobs nicht manuell abbrechen (Es sind ca. 2000 Bilder). Also hatte ich mir schon Folgendes überlegt:

Code:
#!/bin/bash

for ICON in `find . -iname '*.svg'`
do
   killall sleep
   echo "converting picture "$ICON""
   inkscape -f "$ICON" --verb=org.inkscape.color.grayscale --verb=FileSave --verb=FileClose & sleep 120 && kill $(pgrep inkscape)
done

Ich hatte gedacht, so könnte ich hängende Konvertierungs-Jobs killen. Könnte ich wahrscheinlich auch, aber selbst bei schnell konvertierten Bildern wird mit dem Schleifendurchlauf gewartet, bis sleep fertig ist. Das dauert mir verständlicherweise etwas zu lange.

Gestern kam mir dann noch das hier in den Sinn:
Code:
#!/bin/bash

for ICON in `find . -iname '*.svg'`
do
   killall sleep
   echo "converting picture "$ICON""
   inkscape -f "$ICON" --verb=org.inkscape.color.grayscale --verb=FileSave --verb=FileClose & sleep 300 &
	while [ -n $(pgrep sleep) ]
	do
		sleep 5
   		if [[ -n $(pgrep inkscape) ]]; then
			if [[ ! -n $(pgrep sleep) ]]; then
	   		kill $(pgrep inkscape)
			fi
		fi
	done
done

Ich denke, dass das vom Ansatz her nicht so falsch ist. Gestern funktionierte das noch ganz gut (Oder ich hab noch dran rumgespielt und erinnere mich nicht) bis auf eine Fehlermeldung, die ich gerade reproduzieren wollte, was aber nicht ging.

Naja, davon abgesehen hätte ich auch gerne noch ein Weiteres "Feature" implementiert, das mir die Namen der Dateien, bei denen inkscape gekillt wurde, in eine Logdatei schreibt.

Pseudo stelle ich mir das insgesamt in etwa so vor:

Code:
for (alle svgs unterhalb von ./icons)
do
  versuche 3 Minuten inkscape <parameter>
  sonst
      schreibe $(ps ax | grep inkscape) mit timestamp in eine Datei
      kille den inkscape-prozess
done

Geht das mit irgendeiner Bash-internen Funktion oder von mir aus auch einem externen Programm besser als mit sleep?
Wenn nicht, wie bau ich das if-Konstrukt am Besten auf, brauche ich überhaupt eins?

Ich wünsche euch allen einen schönen Tag.

Gruß
Sash
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Bei den pngs mache ich das selbstverständlich auch mit imagemagick:

Code:
#!/bin/bash

for ICON in `find . -iname '*.png'`
do
   echo "converting picture "$ICON""
   convert -colorspace gray "$ICON" "$ICON"_""
   mv -f "$ICON"_"" "$ICON"
done

Das funktioniert auch wunderbar.
Nur leider sind svgs Vektorgrafiken, pngs allerdings Rastergrafiken.
Imagemagick hat mit Vektorgrafiken meines Wissens nach nichts am Hut.
Oben aufgeführter Convert-Befehl endet auf svgs angewandt mit sowas Hübschem wie
kaputte_svgsrbqa.png


Das hatte ich vorher schon ausprobiert.

Edit: So Sachen wie in pngs konvertieren kann Imagemagick natürlich, vielleicht auch drehen oder so. Aber wie man oben sieht, machen Farbkonvertierungen da nicht so wirklich Sinn mit.
 
Zuletzt bearbeitet:
Offiziell wirds halt unterstützt, aber wenns nicht klappt ist natürlich schlecht. Dann muss doch inkscape herhalten. Hat das keine log Funktion die man greppen kann?
 
Die Sache mit dem Loggen, ist noch das, was mich am Wenigsten interessiert und vor allem am Leichtesten zu implementieren wäre, wenn denn das Eigentliche klappt.

Nochmal auf den Punkt, was ich genau will:

Gebe einem Programmaufruf innerhalb einer for-Schleife einen gewissen Zeitraum, in der er beendet sein muss. Starte anschließend wieder die Schleife.

Da irgendwo ein kill und pgrep $(inkscape) >> meine_logfile.log zwischenzuklatschen, bekomm ich noch hin ;)
 
Ich dachte dabei auch eher daran, auftretende Fehler zu erkennen und dann den prozess abzuschiessen.
Alles was du sonst brauchst ist doch nur ps, sleep, grep und kill
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh