SHOW:
|
|
- or go back to the newest paste.
| 1 | #! /bin/bash | |
| 2 | ||
| 3 | getopt -T &> /dev/null | |
| 4 | if [ $? -ne 4 ]; then | |
| 5 | echo "${0##*/}: GNU's enhanced version of getopt is not installed" > /dev/stderr
| |
| 6 | exit 1 | |
| 7 | fi | |
| 8 | ||
| 9 | OPTIONS="z:tr" | |
| 10 | ||
| 11 | PTimeZone="" | |
| 12 | PEnableTouch="no" | |
| 13 | PEnableRename="no" | |
| 14 | ||
| 15 | ARGS="$(getopt -o "$OPTIONS" -n "${0##*/}" -- "$@")" || exit
| |
| 16 | eval set -- "$ARGS" | |
| 17 | ||
| 18 | while true; do | |
| 19 | getopts "$OPTIONS" opt || break | |
| 20 | case "$opt" in | |
| 21 | "z") | |
| 22 | PTimeZone="$OPTARG" | |
| 23 | ;; | |
| 24 | "t") | |
| 25 | PEnableTouch="yes" | |
| 26 | ;; | |
| 27 | "r") | |
| 28 | PEnableRename="yes" | |
| 29 | ;; | |
| 30 | esac | |
| 31 | done | |
| 32 | ||
| 33 | shift "$(($OPTIND-1))" | |
| 34 | ||
| 35 | if [ $# -lt 1 ]; then | |
| 36 | cat << EOF > /dev/stderr | |
| 37 | ||
| 38 | Touch and/or rename photos based on EXIF timestamp | |
| 39 | - | Written by Müszi <[email protected]> |
| 39 | + | |
| 40 | Usage: ${0##*/} [ <options> ] <filename> [ <filename> ... ]
| |
| 41 | ||
| 42 | Options: | |
| 43 | -z Set EXIF timestamp's timezone (default is the local timezone) | |
| 44 | -t Enable touch mode | |
| 45 | -r Enable rename mode | |
| 46 | ||
| 47 | EOF | |
| 48 | exit 1 | |
| 49 | fi | |
| 50 | ||
| 51 | command="exif" | |
| 52 | commandvar="${command//[-.]/_}"
| |
| 53 | eval "$commandvar"="$(command -v "$command")" | |
| 54 | if [ -z "${!commandvar}" ]; then
| |
| 55 | echo "${0##*/}: $command not installed" > /dev/stderr
| |
| 56 | exit 1 | |
| 57 | fi | |
| 58 | ||
| 59 | for filename in "$@"; do | |
| 60 | if [ ! -r "$filename" ]; then | |
| 61 | echo "${0##*/}: $filename: file not found or not readable" > /dev/stderr
| |
| 62 | continue | |
| 63 | fi | |
| 64 | printf "%-16s " "$filename" | |
| 65 | exif_datestamp="$("$exif" -t "DateTimeOriginal" "$filename")"
| |
| 66 | if [ -z "$exif_datestamp" ]; then | |
| 67 | echo "EXIF entry \"Date and Time (original)\" not found" | |
| 68 | continue | |
| 69 | fi | |
| 70 | unset ExifYear ExifMonth ExifDay ExifHour ExifMin ExifSec | |
| 71 | eval "$(echo "$exif_datestamp" | awk 'BEGIN { FS="[ :]+" } $2=="Value" && $3!="" && $4!="" && $5!="" && $6!="" && $7!="" && $8!="" { printf "ExifYear=%u\nExifMonth=%u\nExifDay=%u\nExifHour=%u\nExifMin=%u\nExifSec=%u\n",$3,$4,$5,$6,$7,$8 }')"
| |
| 72 | if [ -z "$ExifYear" -o -z "$ExifMonth" -o -z "$ExifDay" -o -z "$ExifHour" -o -z "$ExifMin" -o -z "$ExifSec" ]; then | |
| 73 | echo "EXIF entry \"Date and Time (original)\" empty or invalid" | |
| 74 | continue | |
| 75 | fi | |
| 76 | ExifTimeStamp="$ExifYear-$ExifMonth-$ExifDay $ExifHour:$ExifMin:$ExifSec $PTimeZone" | |
| 77 | if [ "$PEnableTouch" = "yes" ]; then | |
| 78 | touch -t "$(date -d "$ExifTimeStamp" "+%Y%m%d%H%M.%S")" "$filename" | |
| 79 | fi | |
| 80 | if [ "$PEnableRename" = "yes" ]; then | |
| 81 | filename_dirname="$(dirname "$filename")" | |
| 82 | filename_basename="$(basename "$filename")" | |
| 83 | new_basename="$(date -d "$ExifTimeStamp" "+%Y%m%d-%H%M%S")-${filename_basename##*-}"
| |
| 84 | if [ "$new_basename" != "$filename_basename" ]; then | |
| 85 | mv -f "$filename" "$filename_dirname/$new_basename" | |
| 86 | fi | |
| 87 | fi | |
| 88 | date -d "$ExifTimeStamp" "+%Y-%m-%d %H:%M:%S %z" | |
| 89 | done. |