I recently used Google Takeout to get a copy of all the photos and videos I had backed up there. I discovered, to my horror, that the files' timestamps were all wrong. I created a short script using bash and jq to rectify the situation.

  1. Use https://takeout.google.com/ to get a copy of your photos and videos
  2. Unpack the contents in a directory
  3. Copy the below script in it
  4. Run it
  5. That’s it.

The idea behind the script is that Google keeps the original image or video’s information in a .json file named after the file.

In it, there are two pieces of important information:

Using that information, and a little date and touch magic, it’s possible to ensure the files have a proper modification time.

This then ensures they show up properly using systems which use the file timestamp as an indication as to when it was taken.

Here’s the script, in all its glory:

#!/bin/bash
set -e
while read -r json_file; do
    dirname=$(dirname "$json_file")
    picture_ts=$(jq -r '.photoTakenTime|.timestamp' "$json_file")
    filename=$(jq -r '.title' "$json_file")
    if [[ "$filename" != "null" ]]; then
        filename="$dirname/$filename"
        if [[ -e "$filename" ]]; then
            touch_string=$(date -d "@$picture_ts" +%Y%m%d%H%M)
            ls -la "$filename"
            touch -m -t "$touch_string" "$filename"
            ls -la "$filename"
        else
            >&2 echo "Cannot find $filename referenced by $json_file"
        fi
    fi
done < <( find ./ -name '*.json' )