从文件名中获取时间并纠正修改时间

杂谈 | 共 2869 字 | 2018/12/11 发表 | 2018/12/12 更新

今天折腾谷歌相册的时候不小心把所有图片的日常都设置成了同一天,没有什么解决方案只能重新下载并上传。虽然照片我都有本地备份,但一些手机电脑截图并没有,所有即使重新上传也没用。但截图的文件名里包含了创建时间,所以我就想能不能写个脚本读取文件名并提取时间,再「纠正」文件的修改时间,脚本已经放到Github上了。

起因

总所周知,Google 提供了免费用来备份「高画质」照片与视频的「无限存储空间」。虽然我并不是很缺备份的地方,但是谷歌相册有人工智能大数据加持,找起照片来十分方便,尤其适合我这种很喜欢照相录像的人。我最早是直接把照片传到百度云的,但是后来并不放心百度,就全下载回来,删掉百度云上的,打包加密后重新传了上去。我还是有点担心「隐私」的,虽然也没啥非常值得保密的东西。这也是为什么我这两天又开始把照片传到谷歌相册——即使谷歌的用户协议也没多友好,但是我依然相信谷歌会善待我的数据的。

传着传着我就觉得不对了,我刚照的照片怎么显示是昨天的?仔细一看,我照片咋全是"GMT-5"的?网上搜了一下,发现可以全选照片再设置时区。然而,我手贱不小心把所有照片都设置成了同一个时间。等我反应过来时,将近 5000 张照片已经全部设置成了“2014 年 4 月 10 日上午 9:00"。我赶紧找补救措施,尝试各种可能的方法,包括在官方论坛上发了个帖。然而并没有什么用,官方回复也只是说「重新下载并上传」。

其实技术上并没有什么难的,但谷歌就是没有做这个功能。谷歌云端硬盘也不能直接复制文件,更不能复制文件夹,Youtube 的品牌帐号不能导入谷歌相册的图片,这些问题存在了很长时间也没有什么改变。虽然没有什么特别大的影响,但也足以让人恼火一阵子了。

那么,就只好自己动手解决问题了。

写脚本

我基本上没怎么写过脚本,水平可能也就和 JavaScript 差不多——没学过但也能写点,有需求就查查学学勉强能用。这次的任务看起来也没多难,遍历文件夹里的文件,读取文件名并提取时间,然后修改文件的「修改时间」。

遍历文件夹最简单,一个 for 循环的事,修改时间用touch -t $time $file也能轻松搞定。从文件名提取时间倒是把我难住了,折腾了我好几个小时。

一提到「提取」我首先想到的是正则,但是我正则的水平甚至不如上面提到的。即使我千辛万苦找到了能提取出来的表达式,也并不会在 bash 里使用。

而且,这些文件很杂,各种软件生成的都有,并不能通过一个统一的表达式一步出结果。

IMG_20180623_195832R.jpg

QQ 截图 20170121191446.png

Snipaste_2018-04-15_00-04-34.png

Screenshot2018-05-17-13-48-10-197微信.png

涂鸦Screenshot_2018-09-08-23-15-08-336知乎.png

Screenshot_20181121-223639.png

(好吧其实也没多杂)

总之,正则对我而言并不是一个合适的选择。我又想能不能找到一个软件能输入字符串输出标准时间的,但我应该是想多了。

正当我盯着这些文件名准备放弃时,我突然灵机一动,发现这些文件名都是直接由日期与时间组成的,所以可以直接提取所有数字。

touch命令需要的时间是精确到秒的,也就是 14 位数字再加个点就行201812111629.35。这些文件名中的时间大部分是都是 14 位的,有些 17 位的只要裁剪掉最后 3 位毫秒即可,一句sed -nr 's/[^0-9]//gp'就可以轻松获取时间。

后续

既然要重新上传,那不如用 GSuite 的「无限存储」来存原图好了。GSuite 商业版的价格是每月 10 刀,使用优惠码后 8 刀,还是有点小贵。不过有免费试用 14 天我就先用用看,想要优惠码的朋友可以联系我哦~

然而问题依然存在,而且十分诡异,我所有上传的老照片老视频的时区都是错误的,错误的种类还有好几种。

举个例子,假如我在1911年10月10日18:30UTC+8拍了点照片和视频,照片上传后会变成1911年10月10日18:30UTC-5或者1911年10月10日18:30UTC-6(不同的影集错误的时区还不同),而视频会变成1911年10月10日05:30UTC-5。虽然可以批量选择后修改时区,但是还要我手动调整时区和时间,我也要注意照片是哪个错误的时区的。

UTC-5UTC-6显然是美国时区,但我上传的 IP 应该是台湾的或者日本的,我估计是谷歌服务器把自己的时区当成默认的了,因为我这些照片都没有 GPS 信息,EXIF 数据也不包含时区。

上网搜了搜,谷歌的客服依然鸡肋,论坛里也没啥干货。但一些回复中提到了通过 APP 上传。我意识到可能是 Web 端的问题,于是我安装了「Backup and Sync」。虽然这个软件看起来也挺鸡肋的,操作十分反人类,但我上传的照片终于没有时区错误了,因为通过这玩意上传的照片根本没有时区。

所有文件都是 UTC 时间,我估计是直接读时间戳生成。虽然还是要手动调整时区,但已经比之前方便多了

好吧事实证明我还是想多了,所有上传的照片几乎都还是有时区问题。不同手机照出来的时区问题不同,照片、视频、全景照片也不同,还是要手动一个一个改。

而且直接往云端硬盘的谷歌相册文件夹上传照片似乎并不能在在谷歌相册里显示,问题还不少。

你可能会觉得奇怪,为什么这么麻烦我还要花时间精力来折腾这些老照片,也许我以后都不会看呢?

确实有些照片我可能不太会看,因为照片太多了,也没那么多机会老去看照片。

但我觉得, 人生中的每个时间点都是独一无二的,过去了就再也回不去了。每次我看初中拍的照片都会感慨万千,我十分后悔初中的时候没带手机去学校,自己都没照过照片,仅有几次去春游时候的,照的也不多。很多有趣的事仅有记忆,而记忆又并不可靠,有些事我甚至记不清是否真的发生过,或者也许只是梦。这是件十分痛苦的事。

所以,老照片对我而言是无比珍贵的,把我脑海中的点点滴滴联系起来。这也是为什么买了黑卡 6 以后我每天都会至少照一张照片。很多时候,一张照片就是一个故事。


对了,我上传都用 GCP 了,反正传入到 GCP 不要钱,传出到谷歌服务也不要钱。免费的美西小鸡我还用来跑 rclone,在谷歌云端硬盘里互相传数据,谁让它不支持复制文件呢?