我做了一个简短而丑陋的脚本,以创建一张照片列表以及拍摄日期。
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
的运行速度非常。有谁有替代方法?最好(但不是专门)使用本机工具,因为它是服务器,并且说服管理员安装新工具并非易事。
答案 0 :(得分:1)
native tools
? identify
是这项工作的最佳选择(“ 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)
丢掉grep
和sed
,然后使用-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个字符。”