前言
由于照片移动不当,导致部分照片在时间线插队,即部分照片直接显示在移动操作的一天。为了更好的贴合原来的时间线,快速修改,拟定以下几种调整逻辑。其实就是按文件名,贴着有时间的修改日期。部分就只能指定了。
通过这种“逆/正序寻锚、逐个回溯”的逻辑能非常优雅地修复因拍摄日期异常导致的时间断档。
正序(跳开异常年份数据)
#!/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 "✨ [同年正序修改] 链式修复任务完成!"
