Fotos in Verzeichnisse sortieren

Gespeichert von Erik Wegner am/um
Body

Der Import von Fotos vom Mobiltelefon hat dazu geführt, dass alle Fotos in einem Verzeichnis gelandet sind. Für die Archivierung sollen sie jedoch so umsortiert werden, dass sie in Unterordnern landen, jeweils eine Ebene für das Jahr, den Monat und den Tag.

Praktischerweise enthält der Dateiname in einer bestimmten Form das Aufnahmedatum des Bildes. Damit kann also ermittelt werden, wohin das Bild später verschoben wird.

Beim Import sind die Aufnahmen verschiedener Anwendungen übertragen worden, sodass die Dateinamen nach verschiedenen Mustern aufgebaut sind. Auf diese Anforderung wird in folgendem Code berücksichtigt.

Zur Kontrolle, dass alle Dateien verarbeitet wurden, wird am Ende ausgegeben, welche Dateien nicht zugeordnet werden konnten. Diese Dateien werden in der Liste unproc (Zeile 26) gesammelt.

Das Anlegen der erforderlichen Unterverzeichnisse soll nur einmal passieren. Die Verzeichnisse werden daher in directories (Zeile 31) abgelegt. Der Befehl selbst (Zeile 30) wird mit dem Parameter -p  aufgerufen, um alle erforderlichen Verzeichnisebenen automatisch anzulegen.

Aufruf

  1. Alle relevanten Dateinamen werden in die Textdatei filelist.txt geschrieben.
  2. Das Script wird mit dem Python3-Interpreter ausgeführt. Sind am Ende noch Dateien übrig, die behandelt werden sollen, muss der Code entsprechend erweitert werden.
  3. Das Script wird mit dem Python3-Interpreter ausgeführt und die Ausgabe an eine Bash weitergereicht:
    python3 procimport.py | bash

Quellcode

unproc = []
directories = []

def procfilename(name):
	"Zerlege den Dateinamen in Datumsbestandteile"
	p = ""
	if name.startswith('Lumia 1020_'):
		p = name[11:19]
		y = name[11:15]
		m = name[15:17]
		d = name[17:19]
		#print (name + ' => ' + y + '/' + m + '/' + d)
	if name.startswith('WP_2'):
		p = name[3:11]
		y = name[3:7]
		m = name[7:9]
		d = name[9:11]
		#print (name + ' => ' + y + '/' + m + '/' + d)
	if name.startswith('Office Lens'):
		p = name[12:20]
		y = name[12:16]
		m = name[16:18]
		d = name[18:20]
		#print (name + ' => ' + y + '/' + m + '/' + d)
	if p == "":
		unproc.append(name)
		return
	directory = y + '/' + m + '/' + d
	if directory not in directories:
		print ('mkdir -p ' + directory)
		directories.append(directory)
	print ('mv "' + name + '" ' + directory)

def readfile(fname):
	with open(fname) as f:
		for line in f:
			procfilename(line.strip())
	print(repr(unproc))

if __name__ == "__main__":
	readfile('filelist.txt')