Skip to content

Instantly share code, notes, and snippets.

What would you like to do?

Last updated: 2017-03-18

Searching for Files

Find images in a directory that don't have a DateTimeOriginal

exiftool -filename -filemodifydate -createdate -r -if '(not $datetimeoriginal) and $filetype eq "JPEG"' .

###Output photos that don't have datetimeoriginal to a CSV### Note this can take a long time if you have a lot of jpgs

# You'll need to set your Dropbox folder path. I have mine set as a global variable

FILECOUNT=$(mdfind -count -onlyin "$DROPBOX_PERSONAL" 'kMDItemKind =="JPEG image"')
while IFS= read -r -d '' n; do
    if grep -q "$n" "$OLDFILE"; then
        echo "Skipping $n"

    echo -ne "Remaining: $FILECOUNT\r"
    exiftool -q -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00"))' -csv -common "$n" | sed 1d >> "$DROPBOX_PERSONAL/nodates.csv"
done < <( mdfind -onlyin "$DROPBOX_PERSONAL" 'kMDItemKind =="JPEG image"' -0 )

See files File Modify Date recursively in a directory who don't have datetimeoriginal set

exiftool -filemodifydate -r -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00")) and ($filetype eq "JPEG")' .

Modifying Files

Create Captions From a Filename

The command alone will put the full filename in the comments. If you want to add the filename without the extension, add the example exiftool config file found here

# This is the command if you have the config installed
exiftool '-Comment<BaseName' '-UserComment<BaseName' .

# Getting the filename without the config file, but with a for-loop
for i in *; do 
	exiftool "-Comment=$FileName" "-UserComment=$FileName" "$i";

###Change JPG to jpg and MOV to mov in filenames###

for i in *.JPG; do mv "$i" "${i%%.JPG}.jpg"; done; !#:gs/JPG/MOV/:gs/jpg/mov/


find /path/to/directory -name *JPG -exec sh -c 'mv "$0" "${0%%.JPG}.jpg"; echo "Moved $0 to ${0%%.JPG}.jpg"' {} \;

###Change last created and modified for files in a directory###

The date syntax has to be YYYY:MM:DD HH:MM:SS

Option 1:

find . -name "*.jpg" | while read filename;  
    exiftool "-AllDates=1986:11:05 12:00:00" "$filename";

Option 2:

exiftool "-AllDates=1986:11:05 12:00:00" -if '$filetype eq "JPEG"' .

Timeshift Photos by One Year

Info at

exiftool "-AllDates+=1:0:0 0" .

Rename files to datestamp

Filename looks like 2014-01-01 12:00:00.jpg and will append -NUM if DateTimeOriginal is the same for multiple files

exiftool '-FileName<DateTimeOriginal' -d "%Y-%m-%d %H.%M.%S%%-c.%%e" .  

Rename Files to With Milliseconds

Good for burst photos where the seconds are all the same. If milliseconds are only out to 2 digits, use ${SubSecCreateDate} instead

Found at

exiftool -v '-Filename<${datetimeoriginal}${subsectimeoriginal;$_.=0 x(3-length)}.%e' -d %Y%m%d_%H%M%S .

Update any photo that doesn't have DateTimeOriginal to have it based on file modify date

exiftool '-datetimeoriginal<filemodifydate' -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00")) and ($filetype eq "JPEG")' .

Set DateTimeOriginal to Any Arbitrary Timestamp

exiftool '-datetimeoriginal=2015:01:18 12:00:00' .

Moving/Copying Files

###Copy directory recursively into organized folder###

exiftool -o ~/dummy/ -if '$filesize# > 300000' '-Directory<CreateDate' -d ~/Desktop/old_photos2/%Y/%m\ %B -r ~/Desktop/iPhoto\ Library/

-o ~/dummy This flag is to copy, not move. The directory is a fallback if the flag isn't available on the given photo. Good if using something like DateTimeOriginal

-if '$filesize# > 300000' gets files that are over 300kB. I was parsing an iPhoto library where there were thumbnails. The # turns the value to a number. you can use the flag -n to turn all values to numbers

'-Directory<CreateDate' Create directories based on the CreateDate of the photos

-d ~/Desktop/old_photos/%Y/%m\ %B Create folders with the given date format.

-r Run recursively


###Create KML from geotagged photos###

cat $DESKTOP/kml-start.fmt > out.kml
exiftool -n -r -q -p $DESKTOP/kml-placemark.fmt . >> out.kml
cat $DESKTOP/kml-end.fmt >> out.kml

Create CSV of Geo Information

exiftool -csv -filename -imagesize -gps:GPSLatitude -gps:GPSLongitude ./ > long.csv

Update Notes

  • 2017-03-18 - added command to create comments from a filename
  • 2015-08-11 - added line to rename files based on milliseconds
  • 2015-01-18 - added line on how to set a date for a particular photo(s)
  • 2014-12-26 - Adding new recursive command to rename JPG to jpg. Info on using sh with -exec here
  • 2014-12-25 - Added line for copying photos into organized photos.

This comment has been minimized.

Copy link

suvozit commented May 7, 2016

Great work done!! 👍


This comment has been minimized.

Copy link

0x1fff commented Jun 7, 2016 - this may be usefull when geotaging photos with exiftool;


This comment has been minimized.

Copy link

HeLiBloks commented Jan 20, 2017

less dangerous approach
File endings to lower case

rename 's/(\.[A-Z]+$)/lc($1)/ge' *.[A-Z]*


This comment has been minimized.

Copy link

dsoares commented Jan 27, 2017

Also, show what date/time tags exist in files:

exiftool -time:all -s .

This comment has been minimized.

Copy link

mceachen commented Apr 17, 2017

Thanks for this! Github's Markdown parser requires a space after hashes to render headings. I fixed several in my fork, if you want to merge that.


This comment has been minimized.

Copy link

Krzysiu commented Jul 17, 2017

exiftool -P -if "not ($GPSLongitude and $GPSLatitude)" -geotag "f:\gpx\*.gpx" -R "f:\foto"

Set GPS data basing on GPX from all files from f:\gpx\ directory to all photos from f:\foto (recursive), but only for there which don't have lon and lat already. If there are files which doesn't match GPS/GPX data, they will be just ignored. I recommend using it with GPSLogger (opensource app for Android). This way you can quickly geotag all images using all input files.

PS: Exiftool forum is one of the best. Author is so helpful. He solved a lot of my problems. I'm very serious here.


This comment has been minimized.

Copy link

keyurgolani commented Jul 21, 2019

There a way to change all dates of all files with "*.jpg" but keep the timestamp same? Think that might come in handy.


This comment has been minimized.

Copy link
Owner Author

rjames86 commented Jul 22, 2019


exiftool "-AllDates=1986:11:05 12:00:00" . will change all of the dates to the same thing for a directory


This comment has been minimized.

Copy link

dnozay commented Jul 24, 2019

@rjames86 can you please add what licensing terms to use? CC0 / BSD / MIT / Perl / etc.


This comment has been minimized.

Copy link

dnozay commented Jul 26, 2019

Added more changes in in case you want to merge them. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.