从文件名中修改存储在照片文件内的照片日期?

从文件名中修改存储在照片文件内的照片日期?

我正在使用 Google 的 PhotScan 应用程序扫描我所有在数码相机老化之前拍摄的旧照片,并使用照片的日期保存这些照片(例如:19821011_trip.jpg、yyyymmdd_trip.jpg)。

但是这种方法会在照片的属性中使用应用程序保存拍摄照片的当前日期,所以我试图编写一个脚本,从照片的文件名中获取日期信息并更正存储在照片文件属性中的日期。

期望得到您的帮助。

答案1

exiftool救援

我假设你想改变EXIF 数据根据图像文件名中的时间戳(而不是像ls -l所示的那样从文件创建的时间开始)对扫描的图像进行分类。

幸运的是,有一个方便的工具可以解决这个问题,叫做exiftool。如果尚未安装,请运行

sudo apt install libimage-exiftool-perl

首先。exiftool位于标准存储库中。它可以显示和操作文件名和 EXIF 数据。例如,可以根据 EXIF 属性移动文件创建日期并将文件移动到子目录,例如

2018
    Jan
       img0001.jpg
       img0002.jpg
    Feb
       img0003.jpg
       img0004.jpg

等等。但那是另外一个故事,而你恰恰希望事情反过来。

让我们19821011_trip.jpg以你为例,设置所有三个属性日期时间原始创建日期, 和修改日期Oct 11, 1982.有exiftool一个参数,用于解析文件名中类似于日期和时间戳的内容,然后一次性将所有日期设置为该值。不幸的是,文件名必须包含时间戳 (HHMMSS) 才能正常工作,如下所示:

exiftool "-alldates<filename" 19821011_130000_trip.jpg

这会将上面提到的三个日期属性设置为Oct 11, 1982, 01:00:00 PM。由于您的文件名确实不是包含这样的 HHMMSS 部分,我们必须稍微改变一下参数:

exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' 19821011_trip.jpg 

这将从文件名中选取前 8 个字符,附加13:00:00并最终解析该字符串(19821011 13:00:00)以构建所有三个属性的正确日期。exiftool在解析时间戳方面相当不错,但它需求日期之后至少有一个 HHMM 部分。

您也可以exiftool在整个目录上运行:

exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' .

然后它将处理找到的所有图像。不用担心,它会备份所有修改过的文件。

概括:

me@ubuntu:~> exiftool -alldates 19821011_trip.jpg
(no output)

me@ubuntu:~> exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' 19821011_trip.jpg 
    1 image files updated

me@ubuntu:~> exiftool -alldates 19821011_trip.jpg 
Date/Time Original              : 1982:10:11 13:00:00
Create Date                     : 1982:10:11 13:00:00
Modify Date                     : 1982:10:11 13:00:00

答案2

可以touch用如下循环来做

for i in *.jpg; do
  touch -d"${i%_trip.jpg}" "$i"
done

但这不太准确,因为您的文件名只包含日期而没有任何时间信息,因此文件的时间将设置为 00:00:00.000000000。请继续关注我,以找到更好的方法。

每张普通照片都有一个 Exif 标头,其中包含照片拍摄的正确时间戳,前提是相机的日期和时间设置正确。我总是喜欢使用这个,它是万无一失的,并且jhead从包中很容易使用jhead,请参阅man jhead了解详情。一些有用的选项是:

-ft    Sets the file's system time stamp to what is stored in the Exif header.    
-n[format_string]
       This option causes files to be renamed and/ or mmoved using the date information from the Exif header "DateTimeOriginal" field.  If the file is not an Exif file, or the DateTimeOriginal
       does not contain a valid value, the file date is used.  If the new name contains a '/', this will be interpreted as a new path, and the file will be moved accordingly.

jpg根据 Exif 标头时间戳重命名当前目录中的所有文件并更改文件的系统时间戳的命令可以是:

jhead -ft -n'%Y%m%d_trip' *.jpg

jhead如果文件名已经存在则明智地不要覆盖你的文件:

如果目标名称已经存在,则名称后会附加“a”、“b”、“c”等,除非名称以字母结尾,在这种情况下名称后会附加“0”、“1”、“2”等。

如果您的文件没有 Exif 标头,以下选项可能会有所帮助:

-mkexif
       Creates  minimal exif header. Exif header contains date/time, and empty thumbnail fields only. Date/time set to file time by default. Use with -rgt option if you want the exif header to
       contain a thumbnail. Note that exif header creation is very limited at this time, and no other fields can be added to the exif header this way.
-dsft  Sets the Exif timestamp to the file's timestamp. Requires an Exif header to pre-exist. Use -mkexif option to create one if needed.

相关内容