写在前面
- 现代生活离不开手机,照片也是日积月累。
- 至从在操作 iPhone4 的 iCloud 不慎丢失照片之后,痛定思痛。
- 后面的日子一直备份照片、多地备份。时间久了,照片越来越多,整理起来非常头疼。
遇到的问题
- 积攒了10多年的照片,文件数量已接近5万、体积也过250G了。
- 相同照片不同分辨率的版本。
- 截屏图片、非手机拍照的照片。
- 手动整理,遇到量大,无所适从。
我的思考
- 以前只管存,没有花时间整理。现在疫情封闭,是时候整理它了。
- 买了群晖存储,把过往照片全存进去。
- 摸索了一些方式,最终决定写个程序去整理。
整理思路
- 只保留带
Exif
信息的照片,手机/数码相机拍的原图必定包含这些信息。 - 按年来分目录存放,这样目录不会太多,单目录文件也不太多。
- 照片按统一的时间格式重命名。
开干
- 经过几轮编写、调试、验证,脚本新鲜出炉:
- 话不多说,简短源码贴出来:
#!/bin/bash
# Move photo to a format path
sDir="${1:-/volume1/photo/All-In/}"
dDir="${2:-/volume1/photo/Image/}"
mDepth="${3:-2}"
iLog="${dDir}move.csv"
eLog="${dDir}move.err"
declare -A mCode=(["0"]="Created" ["1"]="Exsit" ["2"]="Overwrite" ["3"]="Noneed" ["4"]="Unknow" ["5"]="Failed")
function AddLog(){
echo "${rCode:-4},$(date +%F\ %T),${sPath},${dPath},${fTime}" >>"${iLog}" 2>>"${eLog}"
return "${rCode}"
}
touch "${iLog}" "${eLog}"
find "${sDir}" -maxdepth "${mDepth}" ! -path "*@eaDir*" -iname "*.jpg" -o -iname "*.jpeg" | while read sPath; do
unset "rCode" "dPath" "oTime" "fTime"
grep -q "${sPath}" "${iLog}" && continue || oTime=`exiv2 -q -g Exif.Photo.DateTimeOriginal -P v "${sPath}" 2>>"${eLog}"`
if [ -z "${oTime}" ]; then
rCode=3 && AddLog
continue
fi
fTime=$(echo "${oTime}" | sed 's/:/-/;s/:/-/')
dPath=$(date -d "${fTime}" +"${dDir}%Y/%Y%m%d-%H%M%S.jpg")
if [ -f "${dPath}" ]; then
if [ `stat --printf=%s "${dPath}"` -lt `stat --printf=%s "${sPath}"` ]; then
cp -v "${sPath}" "${dPath}" 2>>"${eLog}" && rCode=2 || rCode=5
else
rCode=1
fi
else
cp -v "${sPath}" "${dPath}" 2>>"${eLog}" && rCode=0 || rCode=5
fi
AddLog
done
验证效果
- 数据无价,读不懂脚本的朋友不建议尝试。开启群晖的ssh-server,连上去、跑起来!晒下执行现场:
- 解决了我的大问题
- 自动筛选原图
- 自动去重(保留最大的)
- 生成图片信息库
- 以后再用不用担心图片多,存也不是、丢也不是了。
来源:oschina
链接:https://my.oschina.net/higkoo/blog/3179534