我安装了一个 wordpress,里面有大量(数百万)图片。我想使用 ImageMagick mogrify 优化这些图片,但我只想处理一次(反复处理会导致图片质量下降)。
我必须进行现场优化(我无法将优化后的图像复制到新位置,因为如果我这样做的话,wordpress 将无法访问它们)。
用户可以在任何时候上传新图像(即使在优化过程中)。更复杂的用户可以上传具有相同名称的相同图像。所以......我想做的是编写以下脚本:
- 将当前日期/时间存储到变量
- 从 lastrun 文件中获取上次运行图像优化的日期。如果上次运行文件不存在,则默认为“1900-01-01 01:01:01”
- 将共享安装到备份服务器(未优化的原件将存储在该服务器中以防万一)
- 搜索任何扩展名为 *.jpg、大于 10KB、修改时间晚于上次运行日期的文件
- 对于任何匹配的文件:
- 将它们复制到备份/原始共享
- 进行适当的优化:
- 将质量降低至 70%
- 删除所有评论和元数据
- 创建渐进式 jpg
- 将当前日期/时间(从第一步)存储到最后运行时间文件(这样我们就不会一遍又一遍地重新处理相同的图像)
这种方法的问题在于,所有新图像的最后修改日期都会在当前日期/时间变量之后,因为该日期/时间变量存储在脚本运行的开始处。
我可以将脚本完成的日期/时间写入 lastrun 文件,但这样我可能会错过脚本运行时的任何文件上传。
那么我如何确保不会重复处理任何图像并且不会错过处理任何图像。
这是我的脚本:
# Only uncomment this the very first time to generate the .lastrun file.
#echo "1900-01-01 01:01:01" >/scripts/config/image-optimizer/.lastrun
sudo mount.cifs //backup-server/original-images /mnt/originals -v -o user=myuser,dom=mydomain,password=redacted
last=$(cat /scripts/config/image-optimizer/.lastrun)
curr=$(date "+%Y-%m-%d %H:%M:%S")
cd /path/to/wordpress
find ./ -type f -name "*.jpg" -size +10k -newermt "$last" -exec cp --parents {} /mnt/originals \; -exec mogrify -quality 70 -strip -interlace Plane -monitor {} \;
echo "$curr" >/scripts/config/image-optimizer/.lastrun
答案1
优化完成后,触摸文件并将修改时间设置为$curr:
find ./ -type f -name "*.jpg" -size +10k -newermt "$last" -exec cp --parents {} /mnt/originals \; -exec mogrify -quality 70 -strip -interlace Plane -monitor {} \; -exec touch --date="$curr" {} \;