如何以比“识别”更快的方式提取“创建日期”

时间:2018-11-28 19:42:12

标签: bash

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

identify -verbose *.JPG | grep "Image:\|CreateDate:" | sed ':a;N;$!ba;s/JPG\n/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的运行速度非常。有谁有替代方法?最好(但不是专门)使用本机工具,因为它是服务器,并且说服管理员安装新工具并非易事。

3 个答案:

答案 0 :(得分:1)

native toolsidentify是这项工作的最佳选择(“ native”,我将imagemagick称为本机工具)。我认为您找不到更快的方法。并行运行3000张图像,您将获得nth-x加速。

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

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

您的sed看起来很奇怪,并在我的平台上输出了“ unmatched]”,我不知道它们应该做什么,但我认为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-
       )\"
" --

这将适用于文件名中没有任何空格的情况。我认为您可以接受,因为您的输出是用空格分隔的,因此您假设文件名没有特殊字符。

答案 1 :(得分:1)

丢掉grepsed,然后使用-format。 500张jpg花了大约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
...

答案 2 :(得分:1)

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个字符。”