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

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

我经常进口照片和视频(主要具有 JPG 和 MOV 扩展名)通过数码相机和平板电脑到我的电脑,我希望看到它们按照拍摄日期和时间已经存在于 EXIF 数据中。因此我希望全部重命名最好使用简单的鹦鹉螺脚本最好在每个文件名前插入日期和时间戳。

到目前为止,我只设法整理了以下 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代替外置工具)可以方便地操纵日期和时间戳,但它的缺点是不适用于视频(例如 MOV)文件

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

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

答案1

我需要重命名我的照片并在这里发现了这个问题 - 我刚刚发现它exiftool可以本地处理它:

http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

如果您想跟踪原始文件名并将扩展名写为小写:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

对于小写的整个文件名也同样适用:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]

答案2

我不喜欢这种重命名方法的原因是 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

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

在这个例子中,重命名具有 CreateDate 时间戳的 MOV 文件,这些时间戳比 JPG 文件晚或早任意小时数,可以通过使用另一个 (-tur) EXIF 数据并删除该时间差异后缀来调整,并且可能需要更改-tur按照系统设置的位置进行操作。

答案3

我会用krename这个。它

  • 显示实时预览
  • 允许撤消
  • 可以递归进入目录
  • 允许多种重命名模式
  • 允许在模式中使用 glob 和正则表达式
  • 铭记历史

答案4

pyRenamer 无法在我新安装的 Ubuntu 16.04 上运行,因此我必须找到另一种方法来解决这个问题。

我在一个文件夹中有诸如IMG_0001.JPG、、 ... 之类的文件。IMG_0002.JPG

我发现Stack Overflow 上的这个问题有用。

首先安装“exiv2”。我的使用方法如下:

for img in $(ls \*.[Jj][Pp][Gg] 2> /dev/null); 
  do exiv2 -r'%Y%m%d_%H%M%S_'"$(tmp=${img%%.\*}
  echo ${tmp##*_})" rename "$img"
done

输出文件名为YYYYMMDD_HHMMSS_0001.JPG,,YYYYMMDD_HHMMSS_0002.JPG... 等。即使照片是在同一秒拍摄的,原始照片序列号也会有所不同。

相关内容