Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save apetersson/9b2e0d3ea020535b5ae48842dfa5a1a4 to your computer and use it in GitHub Desktop.
Save apetersson/9b2e0d3ea020535b5ae48842dfa5a1a4 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Anforderungen:
# - Parameterprüfung: Das Skript akzeptiert mindestens einen Parameter (den Basisordner).
# Ein optionaler zweiter Parameter "scan" aktiviert den Scan-Modus, der nur fehlende
# oder falsche DateTimeOriginal Tags anzeigt, ohne Änderungen vorzunehmen.
#
# - Datum aus Ordnernamen extrahieren: Das Skript extrahiert das Datum aus dem Namen
# des Ordners. Unterstützte Formate sind JJJJ-MM-TT und JJJJ-MM, wobei bei Letzterem
# automatisch der Tag 01 hinzugefügt wird.
#
# - Scan-Modus: Im Scan-Modus durchsucht das Skript alle Dateien in einem Ordner
# (und allen Unterordnern) und gibt diejenigen aus, bei denen das DateTimeOriginal-Tag
# fehlt oder auf ein ungültiges Datum gesetzt ist.
#
# - Korrektur-Modus: Im Korrektur-Modus setzt das Skript das DateTimeOriginal-Tag für alle
# Dateien ohne gültiges Datum auf das aus dem Ordnernamen extrahierte Datum. Ungültige
# Tags werden ebenfalls korrigiert. Für 3gp und MP4-Dateien erfolgt dies nur, wenn im Scan-Modus
# Fehler gefunden wurden. Für andere dateien erfolgt dies jedenfalls.
#
# - Effiziente Verarbeitung: Um die Effizienz zu maximieren, soll ExifTool in "Batch"-Modus
# betrieben werden, indem es einmal pro Ordner aufgerufen wird, anstatt separate Aufrufe
# für jede Datei zu machen. Dies reduziert die Startzeit von ExifTool und verbessert die
# Gesamtleistung.
#
# - Unterstützte Dateitypen: Bearbeitung von Dateien mit den Erweiterungen .jpg, .jpeg, .png,
# .mp4 und .avi.
#
# - Rekursive Verarbeitung: Rekursives Durchlaufen aller Unterordner des angegebenen Basisordners,
# um die oben genannten Operationen auf jeder Ebene der Ordnerstruktur auszuführen.
#
# - Benutzerfeedback: Informative Ausgaben zeigen den Fortschritt der Verarbeitung an, einschließlich
# Warnungen, wenn keine gültigen Daten für einen Ordner gefunden werden können. Die Verarbeitung
# erfolgt in alphabetischer Reihenfolge der Ordnernamen.
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "Verwendung: $0 <Basisordner> [scan]"
exit 1
fi
base_dir="$1"
scan_only=false
if [ "$2" == "scan" ]; then
scan_only=true
fi
# Funktion zum Extrahieren des Datums aus dem Ordnernamen
extract_date_from_folder_name() {
local folder_name="$1"
# Erweiterung der Regex, um das Format JJJJ-MM zu erkennen und automatisch den Tag 01 hinzuzufügen
if [[ $folder_name =~ ([0-9]{4})-([0-9]{2})-([0-9]{2}) ]]; then
echo "${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}"
return 0
elif [[ $folder_name =~ ([0-9]{4})-([0-9]{2}) ]]; then
echo "${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-01"
return 0
else
echo ""
return 1
fi
}
# Funktion zum Scannen oder Korrigieren von EXIF-Daten
process_exif_data() {
local folder_path="$1"
local date_from_folder="$2"
echo "Verarbeite Ordner: $folder_path"
local files=()
while IFS= read -r -d '' file; do
files+=("$file")
done < <(find "$folder_path" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.mp4" -o -iname "*.3gp" \) -print0)
if [ "${#files[@]}" -gt 0 ]; then
if [ "$scan_only" == "true" ]; then
echo "Scanne auf fehlende oder ungültige DateTimeOriginal Tags..."
exiftool -api largefilesupport=1 -if 'not $DateTimeOriginal or $DateTimeOriginal =~ /^0000/' -filename -DateTimeOriginal "${files[@]}"
else
echo "Korrigiere EXIF-Daten basierend auf dem Datum $date_from_folder..."
exiftool -api largefilesupport=1 -d "%Y-%m-%d %H:%M:%S" "-DateTimeOriginal=$date_from_folder 00:00:00" -if 'not $DateTimeOriginal or $DateTimeOriginal =~ /^0000/' "${files[@]}" -overwrite_original
fi
else
echo "Keine unterstützten Dateien gefunden in $folder_path"
fi
}
# Rekursive Funktion zum Durchlaufen der Ordnerstruktur
process_folder() {
local current_folder="$1"
local inherited_date="$2"
local current_folder_name=$(basename "$current_folder")
local date_from_current_folder=$(extract_date_from_folder_name "$current_folder_name")
local effective_date=${date_from_current_folder:-$inherited_date}
if [ ! -z "$effective_date" ]; then
process_exif_data "$current_folder" "$effective_date"
else
echo "Warnung: Kein gültiges Datum gefunden für $current_folder. Überspringe..."
fi
find "$current_folder" -mindepth 1 -maxdepth 1 -type d | sort | while read subfolder; do
process_folder "$subfolder" "$effective_date"
done
}
process_folder "$base_dir" ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment