批量修改安卓图片时间
从旧手机备份图片到新手机,图片的修改时间全变成了现在,图库无法正确归档。 好在原来的图片命名方式比较规范,类似于: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"