问题描述
经常使用手机A拍摄照片并通过蓝牙发送到手机B中,在手机B的相册内移动这些图片以便自动通过dropbox相机上传功能上传至 dropbox。然而,有时在这一过程中会遇到一个奇怪的现象:文件名不正确地显示了发送时而不是拍图时的时间戳。例如,如果用户在2022年5月8日11点01分拍摄了一张照片,并将其命名为IMG_20220508_110108.jpeg
,但实际上上传至dropbox中的时间则是2022年5月9日10点49分33秒,并显示为2022-05-09 10.49.33
。尽管在手机B上相册应用可以正确地识别拍摄日期(2022年5月8日),但在dropbox上传记录中却没有按照实际拍摄时间排序。
解决方案
原因分析
问题的根本在于文件的元数据,特别是文件的修改时间。由于安卓系统不支持直接改变此信息,更常见的情况是拍摄应用会保留拍摄时间和相机元数据(EXIF信息),而蓝牙传输过程中可能会造成日期和时间戳的混乱。
解决方法
方法1:调整相册排序规则
建议用户更改手机B中使用的相册应用程序配置,确保其依据文件的原始拍摄时间进行排序。一些应用提供了该选项以按照相机元数据中的拍图时间而非发送时间来管理照片。
方法2:检查文件唯一性并通过脚本重命名
为了彻底解决这个问题,可以采用以下步骤:
1. 同步获取文件信息:将来自两部手机的全部文件都复制出来,并在同一台电脑上通过命令行工具如sha256sum
计算它们的哈希值。
– 将手机A和B中的图片分别在电脑上存储并计算hash,形成记录表。这有助于识别哪些图片是在同一时间拍摄的,即使文件名不同。
-
分析及归类:
- 在表格中将相同hash值的文件关联起来,确保它们代表的是同一件图片。
-
编程实现:创建一个自定义shell脚本以重新命名dropbox中的文件,使其名称匹配原始拍摄时间。示例如下:
#!/bin/bash
# 假设所有文件都位于某个目录中
img_dir="/path/to/images"
output_file="./images_map.csv"
# 调用sha256sum得到所有文件名和hash值,输出到csv文件
find "$img_dir" -type f | xargs sha256sum > "$output_file"
# 列表读取并处理映射关系
while IFS=',' read -r hash filename; do
# 找出每个文件的拍摄日期 (假设拍摄日期位于某一行)
shot_date=$(grep "$hash" $output_file | awk '{print todate($6); print}' | head -1)
if [[ -n $shot_date ]]; then
base_name=$(basename "$filename")
ext="${base_name##*.}"
new_base_name="IMG_$(echo $shot_date | sed 's/\//_/g')"
# 使用mv命令重命名文件,确保在dropbox中的名称与实际拍摄时间匹配。
mv "$img_dir/$new_base_name.$ext" "$img_dir/${base_name%.*}_${new_base_name}.$ext"
fi
done < $output_file
# 最后的清理工作: 删除临时生成的csv文件
rm -f $output_file
使用该脚本时需确保替换路径及shell命令满足你的具体环境需求。
通过上述方法,我们可以实现对dropbox中上传照片日期的准确匹配,并最终避免由于文件名错误而导致的实际拍摄时间和显示时间混乱的情况。同时,这种方法还能帮助用户恢复原始命名以方便管理个人数据存储和搜索。