#!/bin/bash settings_file="./settings.ini" # Start- und Zielordner als Variablen source_dir=$(sed -nr "/^\[Paths\]/ { :l /^source_dir[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_dir=$(sed -nr "/^\[Paths\]/ { :l /^backup_dir[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") # Sicherungsoptionen backup_actors=$(sed -nr "/^\[Options\]/ { :l /^backup_actors[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_trickplay=$(sed -nr "/^\[Options\]/ { :l /^backup_trickplay[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_trailer=$(sed -nr "/^\[Options\]/ { :l /^backup_trailer[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_banner=$(sed -nr "/^\[Options\]/ { :l /^backup_banner[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_clearart=$(sed -nr "/^\[Options\]/ { :l /^backup_clearart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_clearlogo=$(sed -nr "/^\[Options\]/ { :l /^backup_clearlogo[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_fanart=$(sed -nr "/^\[Options\]/ { :l /^backup_fanart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_landscape=$(sed -nr "/^\[Options\]/ { :l /^backup_landscape[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_poster=$(sed -nr "/^\[Options\]/ { :l /^backup_poster[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_discart=$(sed -nr "/^\[Options\]/ { :l /^backup_discart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_musictheme=$(sed -nr "/^\[Options\]/ { :l /^backup_musictheme[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_nfo=$(sed -nr "/^\[Options\]/ { :l /^backup_nfo[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") # Liste der Dateimuster pro Typ declare -A backup_patterns backup_patterns[trailer]="*-trailer.* *-sample.* *-scene.* *-clip.* *-interview.* *-behindthescenes.* *-deleted.* *-featurette.* *-extra.* trailer.* sample.* scene.* clip.* interview.* behindthescenes.* deleted.* featurette.* extra.*" backup_patterns[banner]="*-banner.* banner.*" backup_patterns[clearart]="*-clearart.* cleartart.*" backup_patterns[clearlogo]="*-clearlogo.* *-logo.* clearlogo.* logo.*" backup_patterns[fanart]="*-backdrop.* *-fanart.* *-art.* backdrop.* fanart.* art.*" backup_patterns[landscape]="*-landscape.* *-thumb.* landscape.* thumb.*" backup_patterns[poster]="*-poster.* *-folder.* *-cover.* poster.* folder.* cover.*" backup_patterns[discart]="*-discart.* *-disc.* discart.* disc.*" backup_patterns[backup_musictheme]="*-theme.mp3 theme.mp3" backup_patterns[nfo]="*.nfo" # Spezielle Ordner für Backup declare -A backup_folders backup_folders[actors]=".actors" backup_folders[trickplay]="*.trickplay" backup_folders[fanart]="*extrafanart" # Maximal 2 parallele Prozesse max_parallel=2 current_jobs=0 # Prüfen, ob der Startordner existiert if [ ! -d "$source_dir" ]; then echo "Startordner existiert nicht: $source_dir" exit 1 fi # Prüfen, ob der Zielordner existiert, sonst erstellen if [ ! -d "$backup_dir" ]; then mkdir -p "$backup_dir" fi # Funktion für das Erstellen eines Backups für Filme backup_movie_folder() { local folder="$1" local movie_name local zip_file # Filmname aus dem Ordnernamen ableiten movie_name=$(basename "$folder") zip_file="${backup_dir}/${movie_name}.zip" echo "Erstelle Backup für Film: $movie_name" # Prüfen, ob die ZIP-Datei bereits existiert und ggf. löschen if [ -f "$zip_file" ]; then echo "Vorhandene ZIP-Datei gefunden. Lösche: $zip_file" rm -f "$zip_file" fi # Temporären Ordner für das Backup erstellen temp_dir=$(mktemp -d) # Eigenen Ordner für den Film im temporären Verzeichnis erstellen movie_backup_dir="${temp_dir}/${movie_name}" mkdir -p "$movie_backup_dir" # Dateien/Ordner sichern, basierend auf den Optionen for type in "${!backup_patterns[@]}"; do eval "should_backup=\$backup_$type" if [ "$should_backup" = true ]; then find "$folder" -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$movie_backup_dir" -- {} + fi done # Spezielle Ordner sichern for type in "${!backup_folders[@]}"; do eval "should_backup=\$backup_$type" if [ "$should_backup" = true ]; then find "$folder" -type d -name "${backup_folders[$type]}" -exec cp -r --target-directory="$movie_backup_dir" -- {} + fi done # Zip-Datei erstellen ( cd "$temp_dir" || exit zip -r "$zip_file" "${movie_name}" >/dev/null ) echo "Backup erstellt: $zip_file" # Temporären Ordner löschen rm -rf "$temp_dir" } # Funktion für das Erstellen eines Backups für Serien backup_series_folder() { local folder="$1" local series_name local zip_file # Serienname aus dem Ordnernamen ableiten series_name=$(basename "$folder") zip_file="${backup_dir}/${series_name}.zip" echo "Erstelle Backup für Serie: $series_name" # Prüfen, ob die ZIP-Datei bereits existiert und ggf. löschen if [ -f "$zip_file" ]; then echo "Vorhandene ZIP-Datei gefunden. Lösche: $zip_file" rm -f "$zip_file" fi # Temporären Ordner für das Backup erstellen temp_dir=$(mktemp -d) # Eigenen Ordner für die Serie im temporären Verzeichnis erstellen series_backup_dir="${temp_dir}/${series_name}" mkdir -p "$series_backup_dir" # Hauptdateien der Serie sichern (im Serienordner selbst) for type in "${!backup_patterns[@]}"; do eval "should_backup=\$backup_$type" if [ "$should_backup" = true ]; then find "$folder" -maxdepth 1 -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$series_backup_dir" -- {} + fi done # Alle Unterordner (z. B. Staffel 01, Staffel 02) durchgehen und sichern find "$folder" -mindepth 1 -maxdepth 1 -type d -name "Staffel*" | while read -r season_folder; do season_name=$(basename "$season_folder") season_backup_dir="${series_backup_dir}/${season_name}" mkdir -p "$season_backup_dir" # Dateien innerhalb des Staffelordners sichern for type in "${!backup_patterns[@]}"; do eval "should_backup=\$backup_$type" if [ "$should_backup" = true ]; then find "$season_folder" -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$season_backup_dir" -- {} + fi done # Spezielle Ordner (z. B. .trickplay) innerhalb der Staffel sichern for type in "${!backup_folders[@]}"; do eval "should_backup=\$backup_$type" if [ "$should_backup" = true ]; then find "$season_folder" -type d -name "${backup_folders[$type]}" -exec cp -r --target-directory="$season_backup_dir" -- {} + fi done done # Zip-Datei erstellen ( cd "$temp_dir" || exit zip -r "$zip_file" "${series_name}" >/dev/null ) echo "Backup erstellt: $zip_file" # Temporären Ordner löschen rm -rf "$temp_dir" } # Warte auf aktuell laufende Prozesse wait_for_jobs() { while [ "$current_jobs" -ge "$max_parallel" ]; do wait -n current_jobs=$((current_jobs - 1)) done } # Verarbeitung starten export -f backup_movie_folder export -f backup_series_folder export source_dir backup_dir backup_patterns backup_folders find "$source_dir" -type f \( -name "*.nfo" -o -name "tvshow.nfo" \) -print0 | \ while IFS= read -r -d '' nfo_file; do folder=$(dirname "$nfo_file") if [[ "$(basename "$nfo_file")" == "tvshow.nfo" ]]; then wait_for_jobs backup_series_folder "$folder" & else if [[ "$folder" != *"/Staffel "* ]]; then wait_for_jobs backup_movie_folder "$folder" & fi fi current_jobs=$((current_jobs + 1)) done # Warte auf alle verbleibenden Prozesse wait