从旧手机备份图片到新手机,图片的修改时间全变成了现在,图库无法正确归档。 好在原来的图片命名方式比较规范,类似于:IMG_20200829_125914.jpg

使用 adb 或者 termux 来完成时间修改。以下为参考 gpt 给出的代码:

#!/system/bin/sh

# 防止出现警告: job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Math result not representable
cd /

BAD_DIR="/sdcard/BadFormatPhotos"
mkdir -p "$BAD_DIR"

# 每处理 N 个文件显示进度
STEP=50

# 支持的扩展名(图片+视频)
SUPPORTED_EXT="jpg|png|gif|mp4"

# 统计变量
total=0
processed=0
skipped=0

# 收集所有目标文件
file_list=""

for dir in "$@"; do
    for file in "$dir"/*; do
        [ -f "$file" ] || continue
        file_list="$file_list\n$file"
        total=$((total + 1))
    done
done

echo "📦 共找到 $total 个媒体文件,开始处理..."

echo -e "$file_list" | while IFS= read -r file; do
    [ -f "$file" ] || continue

    filename=$(basename "$file")
    extension="${filename##*.}"
    lowercase_ext=$(echo "$extension" | tr '[:upper:]' '[:lower:]')

    if [[ "$lowercase_ext" =~ ^($SUPPORTED_EXT)$ ]]; then
        # 格式1: IMG_20200829_125914
        if [[ "$filename" =~ ([0-9]{4})([0-9]{2})([0-9]{2})_([0-9]{2})([0-9]{2})([0-9]{2}) ]]; then
            year="${BASH_REMATCH[1]}"
            month="${BASH_REMATCH[2]}"
            day="${BASH_REMATCH[3]}"
            hour="${BASH_REMATCH[4]}"
            minute="${BASH_REMATCH[5]}"
            second="${BASH_REMATCH[6]}"
        # 格式2: Screenshot_2020-11-18-15-32-11-64
        elif [[ "$filename" =~ ([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})-([0-9]{2})-([0-9]{2}) ]]; then
            year="${BASH_REMATCH[1]}"
            month="${BASH_REMATCH[2]}"
            day="${BASH_REMATCH[3]}"
            hour="${BASH_REMATCH[4]}"
            minute="${BASH_REMATCH[5]}"
            second="${BASH_REMATCH[6]}"
        # 格式3: IMG20200912102514
        elif [[ "$filename" =~ IMG([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2}) ]]; then
            year="${BASH_REMATCH[1]}"
            month="${BASH_REMATCH[2]}"
            day="${BASH_REMATCH[3]}"
            hour="${BASH_REMATCH[4]}"
            minute="${BASH_REMATCH[5]}"
            second="${BASH_REMATCH[6]}"
        # 格式4: VID20200912102514
        elif [[ "$filename" =~ VID([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2}) ]]; then
            year="${BASH_REMATCH[1]}"
            month="${BASH_REMATCH[2]}"
            day="${BASH_REMATCH[3]}"
            hour="${BASH_REMATCH[4]}"
            minute="${BASH_REMATCH[5]}"
            second="${BASH_REMATCH[6]}"
        else
            echo "⚠️ 无法解析时间:$filename → 移动到 $BAD_DIR"
            mv "$file" "$BAD_DIR/"
            skipped=$((skipped + 1))
            continue
        fi

        timestamp="${year}${month}${day}${hour}${minute}.${second}"
        touch -m -t "$timestamp" "$file"
        processed=$((processed + 1))

        if [ $((processed % STEP)) -eq 0 ]; then
            echo "📈 进度:已处理 $processed / $total"
        fi

    else
        echo "❌ 不支持的格式: $filename → 移动到 $BAD_DIR"
        mv "$file" "$BAD_DIR/"
        skipped=$((skipped + 1))
    fi
done

echo "✅ 全部处理完成:"
echo "   ✔️ 有效媒体文件修改时间:$processed"
echo "   ⚠️ 格式/类型不符已移除:$skipped"
echo "   📁 异常文件存放目录:$BAD_DIR"