如何以比"identify"更快的方式提取"Create Date"



我做了一个简短而丑陋的脚本来创建照片列表和拍摄日期。

identify -verbose *.JPG | grep "Image:|CreateDate:" | sed ':a;N;$!ba;s/JPGn/JPG/g' | sed 's[^ ]* ([^ ]*)[^0-9]*(.*)$/1 2/'

输出看起来像

photo1.JPG 2018-11-28T16:11:44.06
photo2.JPG 2018-11-28T16:11:48.32
photo3.JPG 2018-11-28T16:13:23.01

它运行良好,但我的最后一个文件夹有 3000 张图像,脚本在完成任务后运行了几个小时。这主要是因为identify非常慢。有没有人有替代方法?最好(但不完全)使用本机工具,因为它是服务器,说服管理员安装新工具并不容易。

丢失grepsed之类的并使用-format.对于 500 个 jpgs,这大约需要 10 秒:

$ for i in *jpg ; do identify -format '%f %[date:create]n' "$i" ; done

输出:

image1.jpg 2018-01-19T04:53:59+02:00
image2.jpg 2018-01-19T04:53:59+02:00
...

如果要修改输出,请将命令放在done之后,以避免在每个映像之后分叉进程,例如:

$ for i in *jpg ; do identify -format '%f %[date:create]n' "$i" ; done | awk '{gsub(/+.*/,"",$NF)}1'
image1.jpg 2018-01-19T04:53:59
image2.jpg 2018-01-19T04:53:59
...

native toolsidentify是这项工作最好的("原生",我会称imagemagick为原生工具)。我不认为你会找到更快的方法。并行运行 3000 张图像,您将拥有 nth-x 加速。

find . -maxdepth 1 -name '*.JPG' | 
xargs -P0 -- sh -c "
identify -verbose "$1" |
grep 'Image:|CreateDate:' |
sed ':a;N;$!ba;s/JPGn/JPG/g' |
sed 's[^ ]* ([^ ]*)[^0-9]*(.*)$/1 2/'
" --

或者你可以只使用 bashfor f in "*.JPF"; do ( identify -verbose "$f" | .... ) & done.

您的 seds 看起来很奇怪,在我的平台上输出"无与伦比的 ]",我不知道它们应该做什么,但我认为cut -d: -f2 | tr -d 'n'就足够了。图像名称也很奇怪 - 您现在已经有了图像名称......

find . -maxdepth 1 -name '*.JPG' | 
xargs -P0 -- sh -c "
echo "$1 $(
identify -verbose "$1" |
grep 'CreateDate:' |
tr -d '[:space:]'
cut -d: -f2-
)"
" --

这将适用于没有任何空格的文件名。我认为这对你没问题,因为你的输出是空格分隔的,所以你假设你的文件名没有特殊字符。

jhead体积小,速度快,是一个独立的实用程序。示例输出:

jhead ~/sample/images/iPhoneSample.JPG 

示例输出

File name    : /Users/mark/sample/images/iPhoneSample.JPG
File size    : 2219100 bytes
File date    : 2013:03:09 08:59:50
Camera make  : Apple
Camera model : iPhone 4
Date/Time    : 2013:03:09 08:59:50
Resolution   : 2592 x 1936
Flash used   : No
Focal length :  3.8mm  (35mm equivalent: 35mm)
Exposure time: 0.0011 s  (1/914)
Aperture     : f/2.8
ISO equiv.   : 80
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : N 20d 50.66m  0s
GPS Longitude: E 107d  5.46m  0s
GPS Altitude :  1.13m
JPEG Quality : 96

我在MacBook Pro上用0.13秒的速度拍摄了5,000张这样的iPhone图像:

jhead *jpg | awk '/^File name/{f=substr($0,16)} /^Date/Time/{print f,substr($0,16)}'

如果您不熟悉awk,则说"注意以File name开头的行,如果您看到一个,请将字符 16 以后保存为f文件名。注意以Date/Time开头的行,如果看到任何行,请打印您记得的最后一个文件名和当前行的第 16 个字符"。

最新更新