大家小时候学写作文的时候都知道,写清楚时间地点人物干什么很重要。那么一张照片中,时间和地点都能体现在Exif信息中,人物和干什么需要自己去看照片了。
如果自己不想依靠第三方照片管理程序管理照片,只是单纯依靠目录名称和照片名称,那么起一个好目录名很重要。你可以将同样类似的照片放在这个目录下。但是,即使在相同目录下面,照片的命名也是非常重要的。照片拍摄的时间,以及用什么设备拍摄,是两个最重要的信息,因此我们这一次整理文件时,将这两个信息体现在文件名中。
接下来我们一起来整理。
一般从iPhone中拷贝出来的照片,是下面这样子:

目录里面呢?是下面这样子。

看起来很通用常见的相机命名方式。
之前我使用一些软件来整理照片,比如有一个软件叫做NAMEXIF:

很可惜,这个软件有稳定性问题,整理的时候有时候会提示错误,崩溃。另外不支持HEIC格式!
然后我转向Total Commander。TC长得下面这个样子...

Multi-Rename Tool里面可以通过exif插件读取照片的exif信息,轻松将照片进行改名!

但是同样,这个插件也不支持HEIC格式的照片!
谷歌一下关键字[total commander exif plugin heic],结果如下:

看起来希望支持HEIC是不太可能。
好吧,接下来有如下的几个可能性:
- 将HEIC转换成JPG后再处理(那我还不如让iPhone直接输出JPG得了)
- 再去找一下其他支持HEIC改名的软件(之前已经花了好多时间测试很多软件,都不是很靠普)
- 等待我使用的NAMEXIF或者TC的Plugin更新(要到猴年马月?)
上面三个选项都是我不愿意选!就是一个重命名嘛,获取一下照片的EXIF信息,然后改一下文件名而已,和大象塞进去冰箱一样,步骤这么简单,怎么就这么困难呢?
自己动手,丰衣足食!这一次我们自己用脚本解决这个问题。
要改名字,第一步就是获取EXIF信息!而我们这一次的困难就是苹果的HEIC个格式太新。谷歌一下HEIC的EXIF信息怎么读取。关键字[heic exif read command line]
查询结果第一个就是 ExifTool by Phil Harvey

看一下支持的格式,各种各样!发现支持HEIC!---> 哈哈哈,好开心。
然后看一下我们的FreeBSD上有没有现成的软件包:
root@nas:~ # pkg search exiftool
p5-Image-ExifTool-11.01 Perl module for getting EXIF data from image files
p5-Image-ExifTool-devel-10.66 Perl module for getting EXIF data from image files
很好,我们马上装一个!
root@nas:~ # pkg install p5-Image-ExifTool
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
p5-Image-ExifTool: 11.01
Number of packages to be installed: 1
The process will require 19 MiB more space.
3 MiB to be downloaded.
Proceed with this action? [y/N]: y
[1/1] Fetching p5-Image-ExifTool-11.01.txz: 100% 3 MiB 797.1kB/s 00:04
Checking integrity... done (0 conflicting)
[1/1] Installing p5-Image-ExifTool-11.01...
[1/1] Extracting p5-Image-ExifTool-11.01: 100%
注意一下,软件包的名称叫做[p5-Image-ExifTool],但是命令行是[exiftool]。
有了工具,我们试着读取一下照片看看先。
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC
ExifTool Version Number : 11.01
File Name : IMG_2090.HEIC
Directory : .
File Size : 1853 kB
File Modification Date/Time : 2019:09:08 20:20:03+09:00
File Access Date/Time : 2019:09:08 20:20:02+09:00
File Inode Change Date/Time : 2019:09:08 20:20:03+09:00
File Permissions : rwxr--r--
File Type : HEIC
File Type Extension : heic
MIME Type : image/heic
Major Brand : High Efficiency Image Format HEVC still image (.HEIC)
Minor Version : 0.0.0
Compatible Brands : mif1, heic
Handler Type : Picture
Primary Item Reference : 49
Exif Byte Order : Big-endian (Motorola, MM)
Make : Apple
Camera Model Name : iPhone 8 Plus
Orientation : Rotate 90 CW
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Software : 12.1.4
Modify Date : 2019:02:22 19:03:11
Y Cb Cr Positioning : Centered
Exposure Time : 1/17
F Number : 1.8
Exposure Program : Program AE
ISO : 80
Exif Version : 0221
Date/Time Original : 2019:02:22 19:03:11
Create Date : 2019:02:22 19:03:11
Components Configuration : Y, Cb, Cr, -
Shutter Speed Value : 1/17
Aperture Value : 1.8
Brightness Value : 1.320801383
Exposure Compensation : 0
Metering Mode : Spot
Flash : Auto, Did not fire
Focal Length : 4.0 mm
Subject Area : 2150 1886 753 756
Run Time Flags : Valid
Run Time Value : 168858604545083
Run Time Scale : 1000000000
Run Time Epoch : 0
Acceleration Vector : 0.002557792702 -1.001891971 0.01366691477
Sub Sec Time Original : 756
Sub Sec Time Digitized : 756
Flashpix Version : 0100
Color Space : Uncalibrated
Exif Image Width : 4032
Exif Image Height : 3024
Sensing Method : One-chip color area
Scene Type : Directly photographed
Exposure Mode : Auto
White Balance : Auto
Focal Length In 35mm Format : 28 mm
Scene Capture Type : Standard
Lens Info : 3.99-6.6mm f/1.8-2.8
Lens Make : Apple
Lens Model : iPhone 8 Plus back dual camera 3.99mm f/1.8
GPS Latitude Ref : North
GPS Longitude Ref : East
GPS Altitude Ref : Above Sea Level
GPS Time Stamp : 10:03:11
GPS Speed Ref : km/h
GPS Speed : 0.36
GPS Img Direction Ref : True North
GPS Img Direction : 33.96113968
GPS Dest Bearing Ref : True North
GPS Dest Bearing : 33.96113968
GPS Date Stamp : 2019:02:22
GPS Horizontal Positioning Error: 25 m
Image Width : 4032
Image Height : 3024
Image Spatial Extent : 4032x3024
Rotation : 270
Profile CMM Type : Apple Computer Inc.
Profile Version : 4.0.0
Profile Class : Display Device Profile
Color Space Data : RGB
Profile Connection Space : XYZ
Profile Date Time : 2017:07:07 13:22:32
Profile File Signature : acsp
Primary Platform : Apple Computer Inc.
CMM Flags : Not Embedded, Independent
Device Manufacturer : Apple Computer Inc.
Device Model :
Device Attributes : Reflective, Glossy, Positive, Color
Rendering Intent : Perceptual
Connection Space Illuminant : 0.9642 1 0.82491
Profile Creator : Apple Computer Inc.
Profile ID : ca1a9582257f104d389913d5d1ea1582
Profile Description : Display P3
Profile Copyright : Copyright Apple Inc., 2017
Media White Point : 0.95045 1 1.08905
Red Matrix Column : 0.51512 0.2412 -0.00105
Green Matrix Column : 0.29198 0.69225 0.04189
Blue Matrix Column : 0.1571 0.06657 0.78407
Red Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Chromatic Adaptation : 1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168
Blue Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Green Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Image Pixel Depth : 8 8 8
Movie Data Size : 1893342
Movie Data Offset : 3995
Aperture : 1.8
GPS Altitude : 37.2 m Above Sea Level
GPS Date/Time : 2019:02:22 10:03:11Z
GPS Latitude :
GPS Longitude :
GPS Position :
Image Size : 4032x3024
Megapixels : 12.2
Run Time Since Power Up : 1 days 22:54:18
Scale Factor To 35 mm Equivalent: 7.0
Shutter Speed : 1/17
Create Date : 2019:02:22 19:03:11.756
Date/Time Original : 2019:02:22 19:03:11.756
Circle Of Confusion : 0.004 mm
Field Of View : 65.5 deg
Focal Length : 4.0 mm (35 mm equivalent: 28.0 mm)
Hyperfocal Distance : 2.07 m
Light Value : 6.1
EXIF中的各种信息都显示出来了!其实我们改名所需要的就要两行信息:
Camera Model Name : iPhone 8 Plus
Create Date : 2019:02:22 19:03:11.756
因为我们想命名的格式如下[Camera Name]_[Taken Date].[Ext],比如
iPhone 8 Plus_20180929 130108.356.HEIC
接下来,需要你熟悉几个Unix程序就行。
其中一个是grep,是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配的行或文本。
比如我们需要提取拍照设备名称,那么命令行如下:
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep Model
Camera Model Name : iPhone 8 Plus
Lens Model : iPhone 8 Plus back dual camera 3.99mm f/1.8
Device Model :
结果输出了三行,我们只需要第一行即可,所以用head这个命令提取第一行:
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep Model | head -n 1
Camera Model Name : iPhone 8 Plus
然后我们发现,我们需要的信息在冒号之后,我们用awk来提取一下冒号右边的部分
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep Model | head -n 1 | awk -F":" '{print $2}'
iPhone 8 Plus
结果字符串的前面有一个空格,我们将分隔符从冒号改成冒号+空格
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep Model | head -n 1 | awk -F": " '{print $2}'
iPhone 8 Plus
拿到我们需要的设备名称了,已经迈开了一大步!
接下来提取照片拍摄日期,同样,命令行如下:
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep -e Create | tail -n 1 | awk -F": " '{print $2}'
2019:02:22 19:03:11.756
注意到结果包含了冒号,而Windows中,文件名称中有冒号的话,会显示其他文件名,所以我们用tr个命令将冒号去掉。
root@nas:/home/qianhu/112APPLE # exiftool IMG_2090.HEIC | grep -e Create | tail -n 1 | awk -F": " '{print $2}' | tr -d ":"
20190222 190311.756
接下来只需要考虑一些额外的异常情况就把脚本搞定了。
我们最终的脚本如下:
#!/bin/sh
if [ -z "$1" ]
then
echo "No argument supplied"
exit 1
fi
FROM=$1
echo "Processing ${FROM}..."
EXT="${FROM##*.}"
DEVICE=`exiftool "$FROM" | grep -e Model | head -n 1 | awk -F": " '{print $2}'`
DATE=`exiftool "$FROM" | grep -e Create | tail -n 1 | awk -F": " '{print $2}' | tr -d ":" `
echo "Taken by ${DEVICE}..."
echo "Taken at ${DATE}..."
[ -z "${DATE}" ] && exit 0
if [ -z "${DEVICE}" ]; then
TO="${DATE}.${EXT}"
else
TO="${DEVICE}_${DATE}.${EXT}"
fi
echo "Origin File Name ${FROM}"
echo "Change to ${TO}"
[ "${FROM}" == "${TO}" ] && exit 0
CNT=0
while [ -e "$TO" ]; do
let CNT=CNT+1
TO="${DEVICE}_${DATE}_${CNT}.${EXT}"
done
echo "Rename ${FROM} to ${TO}..."
mv "${FROM}" "${TO}"
这个脚本看起来复杂些,不过还是比较好懂得。脚本考虑了一些异常场景,比如
- 脚本没有参数时的处理(直接提示之后退出)
- EXIF中没有日期信息时的处理(不进行改名)
- EXIF中没有设备信息时的处理(文件名中不加上设备名称)
- 文件名已经是整理过的情况。(已经是我们需要的文件名,不需要再次更改)
- 想要更改的文件名中,文件已经存在时的处理(文件名再加一个计数后缀)
接下来我们跑一个看看。
root@nas:/home/qianhu/112APPLE # /root/bin/exifmv.sh IMG_2090.HEIC
Processing IMG_2090.HEIC...
Taken by iPhone 8 Plus...
Taken at 20190222 190311.756...
Origin File Name IMG_2090.HEIC
Change to iPhone 8 Plus_20190222 190311.756.HEIC
Rename IMG_2090.HEIC to iPhone 8 Plus_20190222 190311.756.HEIC...
搞定!我们已经将[IMG_2090.HEIC]改名成[iPhone 8 Plus_20190222 190311.756.HEIC]。
接下来,我们就是重复利用上面的命令,将文件一个个进行改名。用脚本很容易搞定:
# for f in *; do /root/bin/exifmv.sh "$f"; done
Processing DPAH7306.AAE...
Taken by ...
Taken at ...
Processing DPAH7306.JPG...
Taken by ...
Taken at ...
Processing DPAHE7306.JPG...
Taken by ...
Taken at ...
Processing FELH8126.JPG...
Taken by iPhone 8 Plus...
Taken at 20190404 135538.403...
Origin File Name FELH8126.JPG
Change to iPhone 8 Plus_20190404 135538.403.JPG
Rename FELH8126.JPG to iPhone 8 Plus_20190404 135538.403.JPG...
Processing IMG_0085.JPEG...
Taken by iPhone XR...
Taken at 20190406 141207.917...
Origin File Name IMG_0085.JPEG
Change to iPhone XR_20190406 141207.917.JPEG
Rename IMG_0085.JPEG to iPhone XR_20190406 141207.917.JPEG...
Processing IMG_0085.MOV...
Taken by iPhone XR...
Taken at 20190406 073405...
Origin File Name IMG_0085.MOV
Change to iPhone XR_20190406 073405.MOV
Rename IMG_0085.MOV to iPhone XR_20190406 073405.MOV...
Processing IMG_1938 (1).JPEG...
Taken by ...
Taken at ...
Processing IMG_1938 (2).MOV...
Taken by iPhone X...
Taken at 20190322 012245...
Origin File Name IMG_1938 (2).MOV
Change to iPhone X_20190322 012245.MOV
Rename IMG_1938 (2).MOV to iPhone X_20190322 012245.MOV...
Processing IMG_1938.JPEG...
看到文件一个一个改名成功了.... ;-)
接下来就是彩蛋了,之前我的文章中提到可以利用xargs的多线程进行HEIC格式的转换加速,这一次我们也可以这么做,命令如下:
ls * | xargs -P 100 -I PIC ~/bin/exifmv.sh PIC
可以同时转换100个文件!
目录里面2000多个文件,只需要1分钟不到就搞定了!