Skip to content

Instantly share code, notes, and snippets.

@leonmax
Last active June 10, 2020 08:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leonmax/9f254c8995e810a74c8f31f8c94832ef to your computer and use it in GitHub Desktop.
Save leonmax/9f254c8995e810a74c8f31f8c94832ef to your computer and use it in GitHub Desktop.
move image file into their time separated folders based on their EXIF (or fallback to creation time)

requires exifread

pip install exifread
#!/usr/bin/env python3
import os
import sys
from datetime import datetime
import exifread as exif
def _date_from_exif(filename, extension='.jpg'):
date = None
date_by = None
if filename.lower().endswith(extension):
try:
with open(filename, 'rb') as f:
tags = exif.process_file(f)
candidates = [
datetime.strptime(tags[name].values, '%Y:%m:%d %H:%M:%S')
for name in [
'EXIF DateTimeOriginal',
'EXIF DateTimeDigitized',
'Image DateTime'
] if name in tags
]
if candidates:
date = min(candidates)
date_by = "exif"
except:
print(f"Error: {filename}")
return date, date_by
def _data_from_stat(filename):
attr = os.stat(filename)
date = datetime.fromtimestamp(min(attr.st_mtime, attr.st_atime, attr.st_ctime))
date_by = "ctime"
return date, date_by
def process(filename):
date, date_by = _date_from_exif(filename, extension='.jpg')
if not date:
date, date_by = _data_from_stat(filename)
folder = os.path.join(str(date.year), str(date.month))
src = filename
#dst = os.path.join(folder, *filename.split('/')[2:])
dst = os.path.join(folder, *filename.split('/')[2:])
#dst = os.path.join(folder, filename)
if src != dst:
print(f"{src}: @{date_by}-> {dst}")
os.makedirs(os.path.dirname(dst), exist_ok=True)
os.rename(src, dst)
def from_stdin():
try:
#for line in iter(sys.stdin.readline, b''):
for line in iter(sys.stdin.readline, ''):
process(line.strip())
except KeyboardInterrupt:
sys.stdout.flush()
pass
if __name__ == "__main__":
if len(sys.argv) > 1:
filename = ' '.join(sys.argv[1:])
process(filename)
else:
from_stdin()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment