Created
September 10, 2024 15:22
-
-
Save Phlow/13b2c2e3210424252c40ee1e0404596c to your computer and use it in GitHub Desktop.
Image Optimizer – Dieses Skript überwacht einen Ordner auf neue Bild-Dateien (JPEG, PNG) und optimiert diese automatisch.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Bildoptimierungs-Skript | |
# ------------------------ | |
# | |
# Dieses Skript überwacht einen Ordner auf neue Bild-Dateien (JPEG, PNG) und optimiert diese automatisch. | |
# | |
# Installation der benötigten Programme: | |
# | |
# Für macOS mit Homebrew: | |
# brew install fswatch webp guetzli pngquant | |
# | |
# Für Linux (Ubuntu/Debian): | |
# sudo apt-get update | |
# sudo apt-get install fswatch webp guetzli | |
# | |
# Für pngquant auf Linux: | |
# wget https://pngquant.org/pngquant-2.12.5-linux.tar.gz | |
# tar xzf pngquant-2.12.5-linux.tar.gz | |
# cd pngquant-2.12.5-linux | |
# sudo cp pngquant /usr/local/bin | |
# | |
# Hinweis: Die Versionsnummer von pngquant kann variieren. | |
# Prüfen Sie die aktuelle Version auf https://pngquant.org | |
# | |
# Für andere Betriebssysteme oder Paketmanager, bitte die | |
# entsprechenden Installationsanweisungen der jeweiligen Tools befolgen. | |
# Bildschirm leeren | |
clear | |
# Überprüfe Bash-Version | |
echo "Ihre Bash-Version ist: $BASH_VERSION" | |
echo "Dieses Skript ist für Bash 3.2 und höher optimiert." | |
echo "" | |
# Ordner definieren | |
WATCH_DIR="/Users/moritz/Desktop/image_optimized" | |
ORIGINAL_DIR="$WATCH_DIR/Originale" | |
WEBP_DIR="$WATCH_DIR/WebP" | |
JPG_PNG_DIR="$WATCH_DIR/JPG_PNG" | |
PROCESSED_DIR="$WATCH_DIR/Processed" | |
# Benötigte Ordner erstellen | |
mkdir -p "$ORIGINAL_DIR" "$WEBP_DIR" "$JPG_PNG_DIR" "$PROCESSED_DIR" | |
# Globale Variablen für Speicherplatzeinsparung | |
TOTAL_ORIGINAL_SIZE=0 | |
TOTAL_WEBP_SIZE=0 | |
TOTAL_GUETZLI_SIZE=0 | |
# Startmeldung ausgeben | |
echo "--------------------------------------------------" | |
echo "Bildoptimierungs-Skript gestartet" | |
echo "--------------------------------------------------" | |
echo "Das Skript überwacht den Ordner: $WATCH_DIR" | |
echo "$WATCH_DIR" | |
echo "und optimiert automatisch neue Bild-Dateien." | |
echo "" | |
echo "Warte auf neue Dateien..." | |
echo "--------------------------------------------------" | |
echo "" | |
# Funktion für Statusmeldungen | |
print_status() { | |
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | |
} | |
# Funktion zur Ermittlung der Dateigröße | |
get_file_size() { | |
stat -f%z "$1" | |
} | |
# Funktion zur Umwandlung von Bytes in lesbare Größen | |
human_readable_size() { | |
local size=$1 | |
local units=("B" "KB" "MB" "GB" "TB") | |
local unit=0 | |
while [ $size -ge 1024 ] && [ $unit -lt 4 ]; do | |
size=$(( size / 1024 )) | |
unit=$(( unit + 1 )) | |
done | |
echo "$size ${units[$unit]}" | |
} | |
# Funktion zur Verarbeitung der Dateien | |
process_file() { | |
local file="$1" | |
local filename=$(basename "$file") | |
local extension=$(echo "${filename##*.}" | tr '[:upper:]' '[:lower:]') | |
local name="${filename%.*}" | |
# Prüfen, ob die Datei bereits verarbeitet wurde | |
if [ -f "$PROCESSED_DIR/$filename" ]; then | |
print_status "Datei bereits verarbeitet: $filename" | |
return | |
fi | |
print_status "Verarbeite Datei: $filename" | |
local original_size=$(get_file_size "$file") | |
TOTAL_ORIGINAL_SIZE=$((TOTAL_ORIGINAL_SIZE + original_size)) | |
# Kopiere Original in den Originalordner | |
cp "$file" "$ORIGINAL_DIR/" | |
print_status "Original kopiert nach $ORIGINAL_DIR/" | |
# Konvertiere zu WebP | |
cwebp -q 90 "$file" -o "$WEBP_DIR/$name.webp" 2>/dev/null | |
if [ $? -eq 0 ]; then | |
print_status "WebP-Version erstellt in $WEBP_DIR/" | |
local webp_size=$(get_file_size "$WEBP_DIR/$name.webp") | |
TOTAL_WEBP_SIZE=$((TOTAL_WEBP_SIZE + webp_size)) | |
else | |
print_status "Fehler beim Erstellen der WebP-Version" | |
fi | |
case "$extension" in | |
jpg|jpeg) | |
# Optimiere JPEG mit Guetzli | |
guetzli --quality 90 "$file" "$JPG_PNG_DIR/$filename" 2>/dev/null | |
if [ $? -eq 0 ]; then | |
print_status "JPEG optimiert mit Guetzli in $JPG_PNG_DIR/" | |
local guetzli_size=$(get_file_size "$JPG_PNG_DIR/$filename") | |
TOTAL_GUETZLI_SIZE=$((TOTAL_GUETZLI_SIZE + guetzli_size)) | |
else | |
print_status "Fehler beim Optimieren des JPEG mit Guetzli" | |
fi | |
;; | |
png) | |
# Optimiere PNG | |
pngquant --quiet --quality=85-100 --skip-if-larger --strip --force --ext .png "$file" | |
if [ $? -eq 0 ]; then | |
mv "${file%.png}-fs8.png" "$JPG_PNG_DIR/$filename" | |
print_status "PNG optimiert mit pngquant in $JPG_PNG_DIR/" | |
local guetzli_size=$(get_file_size "$JPG_PNG_DIR/$filename") | |
TOTAL_GUETZLI_SIZE=$((TOTAL_GUETZLI_SIZE + guetzli_size)) | |
else | |
print_status "Fehler beim Optimieren des PNG mit pngquant" | |
fi | |
;; | |
*) | |
print_status "Unbekanntes Dateiformat: $extension. Datei wird übersprungen." | |
rm "$file" # Entferne unbekannte Dateien | |
return | |
;; | |
esac | |
# Metadaten der Datei löschen | |
exiftool -all= "$PROCESSED_DIR/$filename" | |
print_status "Metadaten gelöscht für: $filename" | |
# Markiere die Datei als verarbeitet | |
touch "$PROCESSED_DIR/$filename" | |
# Entferne die originale Datei aus dem Überwachungsordner | |
rm "$file" | |
print_status "Originaldatei aus dem Überwachungsordner entfernt" | |
# Zusammenfassung nach jeder Datei ausgeben | |
print_summary | |
print_status "Verarbeitung abgeschlossen für: $filename" | |
echo "----------------------------------------" | |
} | |
# Funktion zur Ausgabe der Zusammenfassung | |
print_summary() { | |
local total_optimized_size=$((TOTAL_WEBP_SIZE + TOTAL_GUETZLI_SIZE)) | |
local saved_space=$((TOTAL_ORIGINAL_SIZE - total_optimized_size)) | |
local saved_percentage=$((saved_space * 100 / TOTAL_ORIGINAL_SIZE)) | |
echo "----------------------------------------" | |
echo "Zusammenfassung der Optimierung:" | |
echo "Originalgröße: $(human_readable_size $TOTAL_ORIGINAL_SIZE)" | |
echo "Optimierte Größe (WebP): $(human_readable_size $TOTAL_WEBP_SIZE)" | |
echo "Optimierte Größe (Guetzli): $(human_readable_size $TOTAL_GUETZLI_SIZE)" | |
echo "Gesamt optimierte Größe: $(human_readable_size $total_optimized_size)" | |
echo "Eingesparter Speicherplatz: $(human_readable_size $saved_space) ($saved_percentage%)" | |
echo "----------------------------------------" | |
} | |
# Setze trap für die Ausgabe der Zusammenfassung beim Beenden | |
trap print_summary EXIT | |
# Überwache den Ordner, schließe dabei Unterordner aus | |
fswatch -0 --exclude "$ORIGINAL_DIR/.*" --exclude "$WEBP_DIR/.*" --exclude "$JPG_PNG_DIR/.*" --exclude "$PROCESSED_DIR/.*" "$WATCH_DIR" | while read -d "" event | |
do | |
if [[ "$event" =~ \.(jpg|jpeg|png)$ ]]; then | |
echo "Neue Datei erkannt: $event" | |
process_file "$event" | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment