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)))