仅处理图像文件一次,不会遗漏任何

仅处理图像文件一次,不会遗漏任何

我安装了一个 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" {} \;

相关内容