Skip to content

Instantly share code, notes, and snippets.

@nmandery
Last active August 29, 2015 14:07
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 nmandery/6891eda3bb212b8bf027 to your computer and use it in GitHub Desktop.
Save nmandery/6891eda3bb212b8bf027 to your computer and use it in GitHub Desktop.
Rename all images in a directory to timestamp when they have been taken. also rename existing sidecar files
#!/usr/bin/env python
#
# Rename all images in a directory to timestamp when they have been taken.
# also rename existing sidecar files
import sys
import glob
import pyexiv2
import os.path
import shutil
FILE_EXTENSIONS=('jpg', 'jpeg', 'crw', 'cr2', 'dng', 'arw')
def print_usage():
print("Rename all images in a directory to timestamp when they have been taken.")
print(sys.argv[0] + " DIRECTORY")
def insensitive_glob(pattern):
def either(c):
return '[%s%s]'%(c.lower(),c.upper()) if c.isalpha() else c
return glob.glob(''.join(map(either,pattern)))
def move(src, dest):
print("moving {0} --> {1}".format(src, dest))
if os.path.exists(dest):
print("{0} already exists. Would be replaced using {1}".format(dest, src))
sys.exit(1)
shutil.move(src, dest)
def rename_photos(directory):
if not os.path.isdir(directory):
print("{0} is not a directory".format(directory))
sys.exit(1)
for ext in FILE_EXTENSIONS:
for filename in insensitive_glob("{0}/*.{1}".format(directory, ext)):
#print(filename)
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
if metadata and 'Exif.Image.DateTime' in metadata.exif_keys:
base_name, extension = os.path.splitext(filename)
# use more precision for fast bulk shots
subsectime = "_00"
if "Exif.Photo.SubSecTime" in metadata.exif_keys:
subsectime = "_" + str(metadata['Exif.Photo.SubSecTime'].value)
new_name = os.path.join(os.path.dirname(filename),
metadata['Exif.Image.DateTime'].value.strftime("%Y%m%d_%H%M%S") + subsectime + extension)
if filename != new_name:
move(filename, new_name)
for sidecarfile in glob.glob("{0}.*".format(filename)):
sbext = os.path.basename(sidecarfile)[len(os.path.basename(filename))+1:]
move(sidecarfile, new_name+"."+sbext)
def run():
if len(sys.argv) < 2:
print_usage()
sys.exit(1)
for directory in sys.argv[1:]:
rename_photos(directory)
if __name__ == "__main__":
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment