requires exifread
pip install exifread
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() |