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


11

我经常将数码相机和平板电脑中的照片和视频(大多具有JPG和MOV扩展名)导入到我的PC中,理想情况下,我希望看到它们按照已存在于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"

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


除了以下出色的答案之外,您还应该查看pyRenamer。我没有将其用于视频文件的经验(它们是否具有EXIF数据?),但可以说它非常适合照片。它也可以将文件扩展名更改为小写。
汤姆·布鲁斯曼

Answers:


6

在这种重命名方法中,我不喜欢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

在此示例中,使用另一个(-tur)EXIF数据并删除该时差后缀来调整重命名具有CreateDate时间戳记为JPG文件之后或之前任何小时数的MOV文件,并删除该时差后缀,可能需要更改-tur part根据系统中设置的位置。


不幸的是,我无法按照您的建议弄清楚如何将文件名转换为小写(在上方插入该行并将最后一行更改$i$j没有任何作用)。取而代之的是,我在开头插入了文件名转换为小写字母,并随意将其作为另一个选项(至少对我有用)添加到答案的末尾,以便我接受您的答案。当然,您可以根据需要进一步编辑答案。
2013年

@sadi用新鲜的眼睛看着它,我可以看到sed命令做错了什么。最新版本将可用,但是当然如果tr方法对您
有用

谢谢。我想知道您是否还可以通过对一个MOV文件使用一个命令,对其他命令使用另一个命令来进一步改善此脚本:如果[扩展名是MOV]等等?等等等等。原因是我刚刚意识到我的MOV文件(来自iPad)中的“ CreateDate”戳记有+4个小时,因此我需要使用其他选项(CreateDate-tur)来实现照片和视频的准确顺序。
2013年

最好的方法(我认为)是使用案例陈述。可以帮助您入门。您也可以使用if语句,但是case语句可以更容易地扩展以获取额外的文件扩展名。在互联网上搜索“ bash case statement”以获取更多信息。
evilsoup

太感谢了!!!如果您不介意,我也会在答案中添加此选项。
2013年

13

我需要重命名我的照片,并在这里找到了这个问题-我才发现可以原生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]

DIR必须是分配照片的文件夹。如果我们已经在要执行命令的文件夹中打开了一个终端,则必须将DIR替换为。而且,如果您想在文件名(即IMG_)中添加前缀,则必须在日期链之前插入该前缀,且不带引号。下面是一个示例:exiftool -d IMG_%Y%m%d_%H%M%S %%-c。%% e“ -filename <CreateDate”。
Nothor


1

我会用krename这个。它

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

0

萤火虫无法在新安装的Ubuntu 16.04上使用,因此我也必须找到另一种方法来解决此问题。

我在一个文件夹中有IMG_0001.JPG,IMG_0002.JPG等文件。检查此站点,https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

首先安装“ exiv2”,然后编写以下命令行:

for $ {ls *。[Jj] [Pp] [Gg] 2> / dev / null)中的img;做exiv2 -r'%Y%m%d_%H%M%S _'“ $(tmp = $ {img %%。*}; echo $ {tmp ## * _})”重命名“ $ img”; 做完了

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.