如何根据EXIF数据重命名多张照片和视频?

Modified on: Thu, 14 Jun 2018 10:47:23 +0800

我经常将照片和视频(主要是JPG和MOV扩展程序)从数码相机和平板电脑导入我的电脑,我希望看到它们根据他们被采取的日期和时间已经存在于他们的EXIF数据中。因此我希望重命名所有,最好使用简单的Nautilus脚本,最好在每个文件名之前插入日期和时间戳。

我到目前为止只设法将以下Nautilus脚本集合在一起,我相信这些脚本远非完美:

我在*。*中的

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

我在此重命名方法中不喜欢的是EXIF日期和时间戳中使用的冒号(例如“2013:09:03 20:55:09_IMG_0108.JPG”)将这些文件稍后传输到其他环境(例如Windows)时出现问题。

此命令(使用exiv2而不是exiftool)可以方便地操作日期和时间戳,但缺点是不能用于视频(例如MOV)文件

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

所以我希望有人可以提出更好的解决方案。如果它甚至设法将原始文件名和扩展名转换为小写,那将是神奇的!

作者:Seth,Sadi

最佳答案

  

我在此重命名方法中不喜欢的是EXIF日期和时间戳中使用的冒号(例如“2013:09:03 20:55:09_IMG_0108.JPG”),这些文件可能会在以后传输这些文件时产生问题其他环境(例如Windows)。

您可以通过sed运行命名方案,用短划线替换冒号和带下划线的空格,如下所示:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

至于使整个小写,你可以使用rename

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

或者您可以使用sed在脚本中执行此操作,如:

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

...然后使用$j变量代替$i行的最终mv。这种sed方式稍微便于携带(如果这对您很重要),因为不同的Linux发行版具有不同的重命名命令,而sed是通用的。

或者,可以按照以下方式修改脚本,以便在开头使用tr执行文件名转换为小写:

arg的

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

要对不同的文件类型执行稍微不同的命令,可以在此脚本中使用bash case语句。例如:

#! /usr/bin/env bash for filename in ./* do tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')" case "$filename" in *.MOV|*.mov) mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp" ;; *.JPG|*.jpg) mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp"" ;; *) echo 'Not a *.jpg or a *.mov!' ;; esac done

在此示例中,通过使用另一个(-tur)EXIF数据并删除该时间差后缀来调整具有CreateDate时间戳的JPV文件的MOV文件,或者删除该时间差后缀,它可能是必须根据系统中设置的位置更改-tur部分。

作者:,evilsoup

相关问答

添加新评论