• 陪伴互联网运营小白共同探索成长,与IT爱好者共享探索乐趣
  • 建站只为分享,欢迎在PC端文章面打赏支持
  • 使用Ctrl+D 可收藏本站

修复exif因拍摄日期异常导致的时间断档

好物文案 陆子方 5天前 33次浏览 0个评论 扫描二维码
文章目录[隐藏]

前言

由于照片移动不当,导致部分照片在时间线插队,即部分照片直接显示在移动操作的一天。为了更好的贴合原来的时间线,快速修改,拟定以下几种调整逻辑。其实就是按文件名,贴着有时间的修改日期。部分就只能指定了。

通过这种“逆/正序寻锚、逐个回溯”的逻辑能非常优雅地修复因拍摄日期异常导致的时间断档。

正序(跳开异常年份数据)

#!/bin/bash

# 1. 待修复文件完整路径列表
FILES=(
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_8927.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9129.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9130.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9131.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9132.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9133.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9134.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9135.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9136.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201810 正序修改/IMG_9137.JPG"
)

# 2. 确保路径列表按文件名正序排列 (从小到大)
IFS=$'\n' SORTED_FILES=($(sort <<< "${FILES[*]}")); unset IFS

echo "🚀 开始执行 [正序修改] 正序寻锚 (+30s) 修复..."

for fullpath in "${SORTED_FILES[@]}"; do
    [ ! -f "$fullpath" ] && continue

    dir=$(dirname "$fullpath")
    filename=$(basename "$fullpath")
    cd "$dir" || continue

    # 核心逻辑:寻找前序锚点 (编号比自己小、且不在待处理列表中或已修复完成的最近一张)
    # 使用 sort -r 反向排序,确保 awk 拿到的第一个就是最接近当前文件的小编号文件
    anchor_ref=$(ls | sort -r | awk -v cur="$filename" '$1 < cur' | while read -r p; do if [[ "$p" =~ ^IMG_[0-9]{4}\. ]]; then # 实时检查 EXIF 年份,确保非 2026 p_year=$(exiftool -s3 -DateTimeOriginal "$p" | cut -d: -f1) if [[ -n "$p_year" && "$p_year" != "2026" ]]; then echo "$p" break fi fi done | head -n 1) if [ -n "$anchor_ref" ]; then # 提取基准时间 ref_time_str=$(exiftool -d "%Y-%m-%d %H:%M:%S" -s3 -DateTimeOriginal "$anchor_ref") # 转换为时间戳并增加 30 秒 base_ts=$(date -d "${ref_time_str//:/-}" +%s 2>/dev/null || date -d "$ref_time_str" +%s)
        new_ts=$((base_ts + 30))
        
        new_time=$(date -d "@$new_ts" +"%Y:%m:%d %H:%M:%S")
        touch_time=$(date -d "@$new_ts" +"%Y%m%d%H%M.%S")

        echo "🔄 处理: $filename <- [锚点: $anchor_ref] | 修正为: $new_time"

        # 写入 EXIF (核心日期及作者标识)
        exiftool -overwrite_original \
            "-DateTimeOriginal=$new_time" \
            "-CreateDate=$new_time" \
            "-ModifyDate=$new_time" \
            -Artist="Manual" \
            -Author="Manual" \
            "$filename"

        # 同步文件系统的修改日期
        touch -t "$touch_time" "$filename"
    else
        echo "⚠️ 警告: $filename 之前找不到有效的参考锚点,已跳过。"
    fi
done

echo "✨ [正序修改] 系列修复任务全部完成!"

 

逆序(跳开异常年份数据)

#!/bin/bash

# 1. 待修复文件列表
FILES=(
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8896.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8895.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8889.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8888.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8887.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8886.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8885.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8882.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8878.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201809 逆序修改/IMG_8877.JPG"
)

# 2. 确保列表按文件名从大到小排列 (逆序处理)
IFS=$'\n' SORTED_FILES=($(sort -r <<< "${FILES[*]}")); unset IFS echo "开始执行 [逆序修改] 系列逆序寻锚修复..." for fullpath in "${SORTED_FILES[@]}"; do [ ! -f "$fullpath" ] && continue dir=$(dirname "$fullpath") filename=$(basename "$fullpath") cd "$dir" || continue # 核心逻辑:寻找后置锚点 # 规则:编号比自己大 ($1 > cur)、年份非 2026 的最近一张正确照片
    next_ref=$(ls | sort | awk -v cur="$filename" '$1 > cur' | while read -r p; do
        if [[ "$p" =~ ^IMG_[0-9]{4}\. ]]; then
            # 检查 EXIF 年份是否已修复(非 2026)
            p_year=$(exiftool -s3 -DateTimeOriginal "$p" | cut -d: -f1)
            if [[ -n "$p_year" && "$p_year" != "2026" ]]; then
                echo "$p"
                break
            fi
        fi
    done | head -n 1)

    if [ -n "$next_ref" ]; then
        # 提取锚点时间
        ref_time_str=$(exiftool -d "%Y-%m-%d %H:%M:%S" -s3 -DateTimeOriginal "$next_ref")
        
        # 将 EXIF 时间转为系统秒级时间戳并减去 30 秒
        base_ts=$(date -d "${ref_time_str//:/-}" +%s 2>/dev/null || date -d "$ref_time_str" +%s)
        new_ts=$((base_ts - 30))
        
        new_time=$(date -d "@$new_ts" +"%Y:%m:%d %H:%M:%S")
        touch_time=$(date -d "@$new_ts" +"%Y%m%d%H%M.%S")

        echo "🔄 修正: $filename <- [锚点: $next_ref] | 新时间: $new_time"

        # 写入 EXIF
        exiftool -overwrite_original \
            "-DateTimeOriginal=$new_time" \
            "-CreateDate=$new_time" \
            "-ModifyDate=$new_time" \
            -Artist="Manual" \
            -Author="Manual" \
            "$filename"

        # 同步系统修改时间
        touch -t "$touch_time" "$filename"
    else
        echo "⚠️ 警告: $filename 右侧找不到有效的参考锚点,跳过。"
    fi
done

echo "✨ [逆序修改] 目录处理完毕!"

特定日期修改

# 1. 定义待处理文件路径
file1="/mnt/S50JW-PICT/ZSF/PHOTO/相机/201802 在家/DWHI5806.jpg"
file2="/mnt/S50JW-PICT/ZSF/PHOTO/相机/201802 在家/WLZI0220.jpg"

# 2. 批量执行修改
for f in "$file1" "$file2"; do
    if [ -f "$f" ]; then
        echo "正在处理特殊命名文件: $(basename "$f")"
        
        # 写入 EXIF 核心日期及作者信息
        exiftool -overwrite_original \
            -Artist="Manual" \
            -Author="Manual" \
            -DateTimeOriginal="2018:02:17 20:10:00" \
            -CreateDate="2018:02:17 20:10:00" \
            -ModifyDate="2018:02:17 20:10:00" \
            "$f"
        
        # 同步文件系统时间 (touch 格式: YYYYMMDDhhmm.ss)
        touch -t 201802172010.00 "$f"
        
        echo "✅ $(basename "$f") 修复完成"
    else
        echo "❌ 未找到文件: $f"
    fi
done

正序(均为同年或不便排除异常)

#!/bin/bash

# 1. 待修复文件完整路径列表
FILES=(
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4350.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4351.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4352.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4353.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4354.JPG"
"/mnt/S50JW-PICT/ZSF/PHOTO/相机/201911 同年正序修改/IMG_4355.JPG"
)

# 2. 确保路径列表按文件名正序排列 (从小到大)
IFS=$'\n' SORTED_FILES=($(sort <<< "${FILES[*]}")); unset IFS

echo "🚀 开始执行 [同年正序修改] 正序寻锚 (+30s) 修复..."

for fullpath in "${SORTED_FILES[@]}"; do
    [ ! -f "$fullpath" ] && continue

    dir=$(dirname "$fullpath")
    filename=$(basename "$fullpath")
    cd "$dir" || continue

    # 核心逻辑:寻找前序锚点 (编号比自己小、且不在待处理列表中或已修复完成的最近一张)
    # 通过 exiftool 实时检查年份,确保锚点是“正确”的
    anchor_ref=$(ls | sort -r | awk -v cur="$filename" '$1 < cur' | while read -r p; do if [[ "$p" =~ ^IMG_[0-9]{4}\. ]]; then # 实时检查 EXIF 年份,非 2026 视为正确锚点 p_year=$(exiftool -s3 -DateTimeOriginal "$p" | cut -d: -f1) if [[ -n "$p_year" && "$p_year" != "2026" ]]; then echo "$p" break fi fi done | head -n 1) if [ -n "$anchor_ref" ]; then # 提取基准时间 ref_time_str=$(exiftool -d "%Y-%m-%d %H:%M:%S" -s3 -DateTimeOriginal "$anchor_ref") # 转换为时间戳并增加 30 秒 base_ts=$(date -d "${ref_time_str//:/-}" +%s 2>/dev/null || date -d "$ref_time_str" +%s)
        new_ts=$((base_ts + 30))
        
        new_time=$(date -d "@$new_ts" +"%Y:%m:%d %H:%M:%S")
        touch_time=$(date -d "@$new_ts" +"%Y%m%d%H%M.%S")

        echo "🔄 处理: $filename <- [锚点: $anchor_ref] | 修正为: $new_time"

        # 写入 EXIF (拍摄时间、创建时间及作者标识)
        exiftool -overwrite_original \
            "-DateTimeOriginal=$new_time" \
            "-CreateDate=$new_time" \
            "-ModifyDate=$new_time" \
            -Artist="Manual" \
            -Author="Manual" \
            "$filename"

        # 同步文件系统的修改日期
        touch -t "$touch_time" "$filename"
    else
        echo "⚠️ 警告: $filename 之前找不到有效的参考锚点(或全是 2026 年文件),已跳过。"
    fi
done

echo "✨ [同年正序修改] 链式修复任务完成!"

子方有料原创丨转载请注明原文链接
期待您的评论或捐赠,这是最好的鼓励和支持!
喜欢 (0)
[赞赏使我快乐]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到