如何根据 EXIF 数据重命名照片?

如何根据 EXIF 数据重命名照片?

假设我有一堆照片,全部都有正确的 EXIF 信息,并且这些照片是随机命名的(因为我遇到了一个问题)。我有一个名为的小程序jhead,它给出了以下输出:

$ jhead IMG_9563.JPG

File name    : IMG_9563.JPG
File size    : 638908 bytes
File date    : 2011:02:03 20:25:09
Camera make  : Canon
Camera model : Canon PowerShot SX210 IS
Date/Time    : 2011:02:03 20:20:24
Resolution   : 1500 x 2000
Flash used   : Yes (manual)
Focal length :  5.0mm  (35mm equivalent: 29mm)
CCD width    : 6.17mm
Exposure time: 0.0080 s  (1/125)
Aperture     : f/3.1
Focus dist.  : 0.29m
ISO equiv.   : 125
Exposure bias: -1.67
Whitebalance : Manual
Light Source : Daylight
Metering Mode: pattern
Exposure Mode: Manual

现在我需要按以下格式重命名文件夹中的所有照片:

001.JPG
002.JPG
003.JPG
...

其中次要编号是较旧的图像,最大编号是较新的图像。

我不太擅长编写脚本,所以我寻求帮助。

我认为bash脚本就足够了,但如果你觉得更舒服,你可以写一个python脚本。

我想是这样的:

$ mv IMG_9563.JPG `jhead IMG_9563.JPG | grep date`

但我不知道如何同时对所有文件执行此操作。

答案1

刚刚发现这里jhead 可以为你做这一切! :)

jhead -autorot -nf%Y-%m-%d_%H-%M-%S *.jpg

答案2

您可以使用 for 循环(在 shell 中/在 shell 脚本中)对所有文件进行访问:

for i in *.JPG; do
  j=`jhead "$i" | grep date | sed 's/^File date[^:]\+: \(.\+\)$/\1/'`.jpg
  echo mv -i "$i" "$j"
done

这只是一个非常基本的轮廓。echo当您确认一切正常后删除。

答案3

exiv2将是一种操作的替代方法,它允许非常简单的语法:

exiv2 是一个读取和写入 Exif、IPTC、XMP 元数据和图像注释的程序,并且可以读取许多供应商的makernote 标签。该程序可以选择在 Exif 标签、XMP 属性和 IPTC 数据集之间进行转换

因此,这将重命名当前文件夹中的所有 jpeg:

for i in *.JPG; do exiv2 -v -r '%Y%m%d.%H%M%S.:basename:' rename "$i"; done

如果您还想添加地理信息,您可以使用exivtool

exiftool '-filename<${gpslatitude;} ${gpslongitude} ${datetimeoriginal}' -d "%Y-%m-%d %H.%M.%S%%-c.%%e" *.JPG

答案4

我喜欢 maxschlepzig 发布的代码,但在输出方面仍然遇到困难。

问题是生成的文件名中的空格(日期字符串和时间字符串之间)。虽然对于任何使用 GUI 的人来说都是微不足道的,但它使命令行上的文件处理变得更加困难。

这里的“sed”命令已基本上更改为四个单独的“sed”操作,以支持之前的整体参数。为了适合我自己,下面还将文件更改为正常的644权限。

for i in *.JPG ; do
  chmod 644 $i
  j=`jhead "$i" | grep ^Date/Time | sed -e 's/^Date\/Time[ ]\+: //;s/:/-/g;s/ /_/g':/-/g;s/ /_/g'`.jpg
  echo mv -i "$i" "$j"
  # mv -i "$i" "$j"
done

相关内容