![如何根据 EXIF 数据重命名照片?](https://linux22.com/image/42668/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%20EXIF%20%E6%95%B0%E6%8D%AE%E9%87%8D%E5%91%BD%E5%90%8D%E7%85%A7%E7%89%87%EF%BC%9F.png)
假设我有一堆照片,全部都有正确的 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