Mal ein kurzer Artikel am Rande, in den vergangenen Tagen ist mein Blog auf einen neuen Server umgezogen. Und keiner hat`s gemerkt :)
Aber darum geht es hier nicht, beim Umzug sind mir meine Gallery Ordner im Wordpress aufgefallen. Dort hortet dieses unheimlich langsame CMS seit 2009 alle Bilder in allen möglichen Auflösungen. Das Problem ist das hier wirklich Gigabyte Weise Daten gehortet werden die ich so online eigentlich gar nicht brauche. Viele CMS Systeme haben die Angewohnheit auch die Originaldatei mit zu speichern, sprich wenn man diese nicht vorher optimiert oder beschneidet sind das einige MB pro Datei. Mein WP Ordner war nun also einige GB groß und das kopieren auf den neuen Server wollte ich mir sparen. Raus kam ein kleines nützliches Shell Script was ich gerne hier zur Verfügung stelle um euch ggf. auch mal von eurer Bilderflut zu erlösen.
Das Script rechnet alle Bilder welche größer als Full HD sind auf 1920 Pixel Breite runter und lässt anschließend ein JPEG Optimierer drüber laufen. Hat bei mir 60% meiner WP Installation mal so eben weg reduziert. Das ganze ist für Linux und benötigt ImageMagick und jpegtrans installiert. Beides sollte in der Repo eurer wahl vorhanden sein. Zur Anwendung einfach dieses Script in das Verzeichnis mit den zu optimierenden Bildern werfen und ausführen. Es werden alle Unterordner recursive mit verwurschtelt also passt auf wo man es startet, immer die Originalen vorher lokal sichern!
Lange Rede kurzer Schluß, hier das Script:
#!/bin/bash # Mass jpeg optimization by Marco Goetze # www.solariz.de # License: GL HF # SIZE_TOTAL=0 SAVED_TOTAL=0 FILES_TOTAL=0 SKIP_TOTAL=0 for file in $(find ** -type f -iname '*.jpg' ) do local fdir=${file%/*} local fname=${file*/} local FILESIZE=$(stat -c%s "$file") echo -n "$fname: " SIZE_TOTAL=$(($SIZE_TOTAL+$FILESIZE)) FILES_TOTAL=$(($FILES_TOTAL+1)) # Ueberspringen wenn File zu klein, # Optimierung lohnt sich hier nicht if [ "$FILESIZE" -lt "10000" ] then echo -skip- to small SKIP_TOTAL=$(($SKIP_TOTAL+1)) continue fi # Per ImageMagick auf FullHD Aufloesung shrinken # Bild wird um platz zu sparen auf 1980 Breite angepasst, # Ratio und Aussschnitt bleiben unveraendert local targetc=$(tempfile --prefix=jpc_) convert -resize 1920\> "$file" $targetc # Nun per JpegTrans optimieren. # ACHTUNG Exif Daten gehen dabei verloren local target=$(tempfile --prefix=jpo_) jpegtran -trim -optimize -copy none "$targetc" > $target # nun berechnen ob wir was gespart haben, # wenn nicht wird die Optimierung verworfen und wir # lassen das Original unangetastet. local FILESIZEC=$(stat -c%s "$target") local diff=$(($FILESIZE - $FILESIZEC)) if [ "$diff" -gt "640" ] then local saved=$(($diff/1024)) SAVED_TOTAL=$(($SAVED_TOTAL+$saved)) echo Saved $saved k mv -f -u $target "$file" else echo -skip- No Saving SKIP_TOTAL=$(($SKIP_TOTAL+1)) fi # Aufraeumen rm $target >/dev/null 2>/dev/null rm $targetc >/dev/null 2>/dev/null done # Ergebnis echo Files : $FILES_TOTAL echo Skipped: $SKIP_TOTAL echo Before : $(($SIZE_TOTAL/1024/1024)) M echo Saved : $SAVED_TOTAL k