Ich brauchte spontan ein Script, was mir Dateien (konkret Bilder und Videos aus einem Ordner vom Handy, wo die Timestamps der Dateien nicht korrekt sind) nach Jahr und Monat anhand des Dateinamens in eine Ordnerstruktur einsortiert.

Das Script listet die Dateien im Eingangsverzeichnis, prüft ob es sich um ein bekanntes Muster handelt und verschiebt, sofern das Muster bekannt ist, die Dateien in den passenden Ordner. Der Zielordner wird bei Bedarf auch erstellt.

Im Vergleich zu Unix-Standardtools wie rename werden hier die Ordner vorher explizit angelegt, auch finde ich Python lesbarer als Bash. Die benötigten Module sollten bei den allermeisten Python-Installationen bereits vorhanden sein.

import argparse
import os
import re

parser = argparse.ArgumentParser()
parser.add_argument('input', help='Directory with images/videos to be sorted')
parser.add_argument('output', help='Directory with year/month structure')

args = parser.parse_args()

input_dir = args.input
output_dir = args.output

files = [os.path.join(input_dir, f) for f in os.listdir(input_dir) if os.path.isfile(f)]

# Format: regex, capture group for year, capture group for month
regex_list = [
    (r"IMG[-_]([0-9]{4})([0-9]{2})[0-9]{2}.*\.(jpe?g|JE?PG)", 1, 2),
    (r"VID[-_]([0-9]{4})([0-9]{2})[0-9]{2}.*\.(mp4)", 1, 2),
]

for f in files:
    print(f"Parsing {f}")
    year = 0
    month = 0
    for r in regex_list:
        match = re.search(r[0], f)
        if match:
            print(match.groups())
            year = match.group(r[1])
            month = match.group(r[2])
            break

    if year == 0 or month == 0:
        print("Could not parse filename")
        continue
    
    f_output_path = os.path.join(output_dir, year, month)
    os.makedirs(f_output_path, exist_ok=True)
    os.rename(f, os.path.join(f_output_path, os.path.basename(f)))