Bash 脚本仅将 EXIF 元数据日期(不是时间)添加到照片所属目录中没有 EXIF 元数据的照片
Bash script to add exif metadata date only (not time) to photos without EXIF metadata from the directory they belong to
我正在尝试使用 jhead
或 exiftool
创建一个脚本来帮助我修复由于 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
我正在尝试使用 jhead
或 exiftool
创建一个脚本来帮助我修复由于 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