提取照片的 EXIF 日期时间作为文件名

汇总了来自几个人一起旅行所拍摄的所有照片之后遇到的一个问题就是,不同设备的命名方式不同,或者相同的话就可能会有照片文件重名的问题。这样非常不利于浏览挑选照片。所以就想将所有的照片重新命名一下。命名的规则就是 <前缀>_<拍摄日期>_<拍摄时间>。这些信息可以通过提取照片的 EXIF 信息得到。当然手工重命名上千张照片是难以完成的,于是就有了下面的批处理代码。

我个人对于命令行的批处理是非常不熟悉的,仅仅是知道有这么个东西。在查阅了一些博文(ref1, ref2, ref3)后终于能够顺利完成这个工作了。只是代码质量可能就不堪入目了,仅仅是凑合能用。

提取 EXIF 信息

因为用的是 Linux(openSUSE Tumbleweed),这方面的工具真的是很齐全。比如 ref1 中提到的 jhead,ref2 中提到的 ImageMagick 中的 identify 等。我所用的系统中刚好默认就安装了 ImageMagick,于是用 identify 试了试,

# identify -verbose IMG_5045.JPG | grep "DateTime"
exif:DateTime: 2016:09:07 11:17:39
exif:DateTimeDigitized: 2016:09:07 11:17:39
exif:DateTimeOriginal: 2016:09:07 11:17:39

出现了 3 条信息,而我们只需要 1 条。于是就修改一下指令,

# identify -verbose IMG_5045.JPG | grep "DateTimeOriginal"
exif:DateTimeOriginal: 2016:09:07 11:17:39

下面要做的就是把返回结果中的日期时间提取出来,改成 20160907_111739 的样子。

修改文件名

统一格式

文件名要利于用文件名排序,而且几个人的照片合到一起之后不能有重复的文件名。所以使用了较复杂的命名格式。还是上面那个文件,IMG_5045.JPG,修改后的文件名为,

IMG_20160907_111739_5045.jpg

嗯,顺手把大写的 JPG 改成了小写的。其实只要前面的一部分 IMG_20160907_111739 采用统一格式就行了,排序就没问题了。

代码实现

这里用的是 sed。我不熟悉,所以参考了 ref1 和 ref3 中的例子,就得到了下面的代码。能用。

# identify -verbose IMG_5045.JPG | grep "DateTimeOriginal" | sed 's/.*\([0-9]\{4\}\)\+:\([0-9][0-9]\)\+:\([0-9][0-9]\) \([0-9][0-9]\)\+:\([0-9][0-9]\)\+:\([0-9][0-9]\)/\1\2\3_\4\5\6/'
20160907_111739

似乎没什么问题。

批处理代码

下面是批处理代码。

从命令行切换(cd)到对应的文件夹,直接在命令行一次性粘贴进去后回车就行了。

注意:当然在我使用前是进行了小范围实验的,避免出现不可挽回的错误。

h="IMG_"
for i in *.JPG; do
    t=`echo "$i" | sed -e 's/IMG//;s/.JPG/.jpg/'`
    m=`identify -verbose "$i" | grep "DateTimeOriginal" | sed 's/.*\([0-9]\{4\}\)\+:\([0-9][0-9]\)\+:\([0-9][0-9]\) \([0-9][0-9]\)\+:\([0-9][0-9]\)\+:\([0-9][0-9]\)/\1\2\3_\4\5\6/'`
    echo mv -f "$i" "$h""$m""$t"
done

因为上面倒数第 2 行的重命名指令之前加了 echo,所以只是输出指令,而并没有执行实际的重命名。测试结果为输出将要执行的指令,可用于检查指令是否有错误,

mv -f IMG_5045.JPG IMG_20160907_111739_5045.jpg
mv -f IMG_5048.JPG IMG_20160907_111934_5048.jpg
mv -f IMG_5049.JPG IMG_20160907_112007_5049.jpg
mv -f IMG_5052.JPG IMG_20160907_112338_5052.jpg

似乎没有什么问题了。就是文件名有些长。

实际使用的时候需要删除上面代码里的那个 echo。保留 echo 在这里是为了避免自己下次用的时候没有先进行测试而造成损失©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/using-exif-datetime-as-file-name/>。转载请保留此信息及相应链接。

4 条关于 “提取照片的 EXIF 日期时间作为文件名” 的评论

  1. 如果用mac的话不用编程很快就搞定了。
    windows下也有adobe bridge cs6.

  2. 引用通告: openSUSE Tumbleweed 更新 Linux 内核 4.13.9 和 KDE 超级包等 | 水景一页

  3. 引用通告: Linux:从照片中移除 EXIF 数据 | 水景一页

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)