我做了一个简短而丑陋的脚本来创建照片列表和拍摄日期。
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
非常慢。有没有人有替代方法?最好(但不完全)使用本机工具,因为它是服务器,说服管理员安装新工具并不容易。
丢失grep
和sed
之类的并使用-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 tools
?identify
是这项工作最好的("原生",我会称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 个字符"。