Created
June 5, 2025 12:30
-
-
Save apetersson/9b2e0d3ea020535b5ae48842dfa5a1a4 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 | |
# 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