Bash 脚本仅将 EXIF 元数据日期(不是时间)添加到照片所属目录中没有 EXIF 元数据的照片

Bash script to add exif metadata date only (not time) to photos without EXIF metadata from the directory they belong to

我正在尝试使用 jheadexiftool 创建一个脚本来帮助我修复由于 Apple 照片导出而导致的元数据问题。我正试图摆脱苹果生态系统,但苹果照片不仅使用 EXIF 对照片进行排序,还导入日期等。因此,当我使用 EXIF 数据导出原始照片时,它们最终会出现在包含日期的目录中,但不会都有exif数据。

例如:

/8 February 2011/img - 6676.JPG

是此目录中唯一没有元数据的照片。我想将日期 (8-2-2011) 添加到元数据中。

不太适合 bash 所以如果有人能提供帮助,我将不胜感激。

继续评论,您可以使用 bash 中的 date -d 轻松将目录名称转换为日期。诀窍是从完整文件名(例如 /8 February 2011/img - 6676.JPG)解析目录。由于它是绝对路径,因此无论您是使用 dirname 命令还是简单地使用bash 参数展开(这里最简单)

这是一个简短的示例,说明如何处理您提供的目录。您可能需要修改 jhead 命令,以便在对所有照片打开任何脚本之前对其进行测试。

#!/bin/bash

f="/8 February 2011/img - 6676.JPG"    ## example filename "$f"

[ "${f:0:1}" = '/' ] && d="${f:1}"     ## check/trim leading '/' for dir "$d"
d="${d%%/*}"                           ## strip filename leaving dir for time in $d
dt="$(date -d "$d" +'%d-%m-%Y')"       ## get date from $d in your format
jhdt="$(date -d "$d" +'%Y:%m:%d')"     ## get date in format required by jhead

## output dates and commands for jhead
printf "file    : \"%s\"\n" "$f"
printf "has date: %s\n" "$dt"
printf "jhead -mkexif \"%s\"\n" "$f"
printf "jhead -ds %s \"%s\"\n" "$jhdt" "$f"

例子Use/Output

$ bash dirtodate.sh
file    : "/8 February 2011/img - 6676.JPG"
has date: 08-02-2011
jhead -mkexif "/8 February 2011/img - 6676.JPG"
jhead -ds 2011:02:08 "/8 February 2011/img - 6676.JPG"

感谢您的帮助。这是我的 "final" 脏脚本,用于修复我的 25k 照片集 exif 文件,由 Apple photos 生成并导出到 Plex 或 Google 照片:

#!/bin/bash
FILES=/share/Photos/Tom/*/*.jpg
DATE_IMPORT="2017:09:1*"
for f in $FILES
do
  date_exif=`jhead -q "$f" | sed -n -e 's/^.*date //p' | cut -d' ' -f 5`
  #echo $date_exif
  if [[ $date_exif =~ $DATE_IMPORT ]]
     then
        aplevent=`echo "$f" | cut -d '/' -f 5`
        date=`echo "$aplevent" | rev | cut  -d',' -f 1 | rev;`
        date_folder="$(date -d "$date" +'%Y:%m:%d')"
        echo "Date exif: "$date_exif
        echo "Date fix:"$date_folder
        echo "$f"
        jhead -mkexif "$f"
        jhead -ds"$date_folder" "$f"
        jhead -ft "$f"
  fi
done