最近在整理历史文件,发现很多历史图片,截图,微信拍照等途径创建的图片没有创建时间和修改时间,导致在相册时间轴错误。集中出现在整理的当天。
这些图片基本在文件名都含有创建时间,大多格式如下:
对于其中绝大部分,带有明确时间的,我们可以很简单的使用exiftool批量修改。
exiftool下载
下载对应系统的版本完成后,以我使用的windows环境举例
解压缩得到exiftool(-k).exe,两种方式:
1.想要全局可使用exiftool命名,把解压缩的exe双击,软件自动复制到了全局可执行文件夹(C:\windows)下
2.我只是需要在照片文件夹下使用一次,直接改名为exiftool.exe,然后复制到照片文件夹
在照片文件夹右键选择 在终端打开 ,打开终端。
使用以下命令批处理:
.\exiftool.exe '-FileModifyDate<filename' *.jpg //批量把文件名中的时间设置为文件修改时间
.\exiftool.exe '-FileCreateDate<filename' *.jpg //批量把文件名中的时间设置为文件创建时间
对于部分文件名为时间戳的,上述命令无法批处理。如:(mmexport1496723149305.jpg等)
由于带时间戳的图片过多,写了个简单node程序自动把时间戳改为时间字符串然后执行命令.
由于数量不大而且五年没写代码了,强制使用了nodejs的同步方法,可自行修改为异步并发(注意并发控制)。
const path = require('path')
const child = require('child_process')
const fs = require('fs')
const types = ['png', 'jpg', 'jpeg', 'heic', 'hevc', 'avi', 'mov', 'mp4']
const files = fs.readdirSync('./')
let success = 0
let fail = 0
let all = 0
let skip = 0
files.forEach(s => {
all = s.length
let p = path.join(process.cwd(), s)
const Stat = fs.statSync(p)
if (!Stat.isDirectory()) {
const pts = s.split('.')
if (pts.length && types.includes(pts.pop())) {
let name = pts.join('')
let filetime
if(parseInt(name)) filetime = parseInt(name)
else if (name.startsWith('mmexport') && name.split('t').length)
filetime = parseInt(name.split('t').pop())
else if (name.startsWith('wx_camera_') && name.split('_').length)
filetime = parseInt(name.split('_').pop())
else filetime = 0
if (filetime) {
const cmd1 = ".\\exiftool.exe -FileCreateDate="+ new Date(filetime).toISOString() +" " + '"' + p + '"'
const cmd2 = ".\\exiftool.exe -FileModifyDate="+ new Date(filetime).toISOString() +" " + '"' + p + '"'
try{
child.execSync(cmd1)
child.execSync(cmd2)
success ++
} catch (e) {
console.log(e)
fail++
}
} else {
skip ++
console.log('skip2 : ' + s)
}
} else skip ++ && console.log('skip1 === >' + s)
}
})
console.log("success: " + success + " fail: " + fail)
console.log('skip: ' + skip)
上面代码我只是处理了我图片命名的几种样式,简单做了if-else处理
上面都是假设你基本懂得使用nodejs的前提。如果不会请安装nodejs,然后吧上述代码复制到文本文件,改名xxx.js。打开终端,输入`node xxx.js`
最终效果:
如果样式过多,也可以是用正则取文件名中的数字字符串,判断是否为10或者13位,并且小于当前时间戳,然后处理。(代码我不写了,正则我试了试,截图给需要的参考)。