如果我通过 exiv 将图像重命名为 exif 日期时间,我将执行以下操作:
find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;
现在可能会出现图片具有完全相同的时间戳(包括秒)的情况。如何使文件名自动唯一?
该命令应该是稳定的,因为如果我再次在相同的目录结构上执行它(可能在添加新图片之后),已重命名的图片不应更改,并且如果添加具有现有文件名的图片,则新文件名应该是唯一的以及。
我的第一次尝试只是将原始基本名称保留在结果文件名中,但是该命令在上述意义上将不稳定。
答案1
你可能想尝试jhead
相反,它是开箱即用的(带有a
, b
...z
后缀,允许最多 27 个具有相同日期的文件)并且不存在 @meuh 提到的稳定性问题:
find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +
或使用exiftool
(手册页中的示例):
exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .
(这里%-c
是一个以 ; 开头的数字后缀-
;如果文件已经存在则添加)
(贡献答案并根据评论进行更正):
如果您想保留原始文件名,只需添加_%%f
:
exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c_%%f.%%e .
答案2
我的版本exiv2
(0.25 001900) 会以交互方式询问当文件名已经存在时要做什么。
exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip?
通过添加选项,-F
它会自动在名称中添加额外的_1
(或等)。_2
Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp
如果该命令第二次运行,它会显示:
This file already has the correct name
并什么也不做,但如果有该_1
部分,它会感到困惑,并将重命名它_2
。每次运行时它都会以非破坏性的方式像这样切换。如果您愿意,可以忽略此选项,或者更改您的find
模式以忽略与某个部分的日期模式匹配的文件_
。
例如,日期格式的正则表达式模式开始[0-9]{4}_[0-9]{2}_...
。为了简化起见,我将只从集合0..9
和中查找 20 个字符的混合_
,即 regex [0-9_]{20}
。为此_
,后跟至少 1 位要查找的数字的后缀是_[0-9]{1,}.jpg
。由于正则表达式必须匹配整个路径,而不仅仅是基本名称,因此包括目录的最终正则表达式是.*/[0-9_]{20}_[0-9]{1,}.jpg
.
所以你可以使用这样的查找:
find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
答案3
Exiv2 可以自行处理。我也花了很多时间寻求这方面的帮助,直到我去看了 exiv2 手册。 -F 选项解决了这个问题。
exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg
如果文件已经存在,它将在末尾附加 _N。
对于那些正在寻找允许创建文件夹的选项的人。
exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *
答案4
Pyrenamer 在我新安装的 Ubuntu 16.04 上不起作用,因此我也必须找到另一种方法来解决这个问题。
我的一个文件夹中有 IMG_0001.JPG、IMG_0002.JPG 等文件。检查这个网站, https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash
首先安装“exiv2”,我编写了以下命令行:
对于 $(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 等。即使照片是在同一秒拍摄的,原始照片的序列号也会有所不同。