debian - 防止 imagemagick 两次修改图像
问题描述
所以我有一个包含很多图像的文件夹。我使用 imagemagick 来优化文件夹内的所有图像。我中止了“优化”图像的命令。现在。一些图像已经过优化,但不是全部。所以我必须再次运行该命令。有没有办法让 imagemagick 跳过已经优化的图像?
这是我通常用来优化所有图像的方法:
for i in *.jpg; do mogrify -quality 85 "$i"; done
解决方案
如果您有数以万计的图像要处理,并且有一台相当现代的机器(即多核 CPU 和不错的 RAM 和磁盘),您可以考虑使用 GNU Parallel。
基本上,如果文件名超过系统的 ARGMAX 限制,则需要将文件名通过管道传输到GNU Parallel 。最好使用以 null 结尾的名称,以便包含空格的文件名继续工作,因此您需要:
find . -name \*.jpg -print0 | parallel -0 --dry-run mogrify -quality 85 {}
如果看起来正确,您可以删除--dry-run
并再次运行它。实际上,mogrify
如果您的 CPU 有 4 个内核,这将保持 4 个副本并行运行 - 即它会使它们保持忙碌,并且应该更快地处理您的图像,但是,它不是最有效的,因为它启动了一个全新的mogrify
过程每个图像,最好添加-X
到GNU Parallel,然后它将mogrify
以您的操作系统可以处理的尽可能多的文件名开始,并且启动一个进程的成本将分摊到大量图像上。那将是:
find . -name \*.jpg -print0 | parallel -0 -X mogrify -quality 85 {}
在您的数据副本上体验任何新软件- GNU Parallel可以非常快速地做很多事情 - 好东西和坏东西!
推荐阅读
- windows - Windows 10 中是否有任何 UI 可以更改当前的 MAPI 提供程序?
- javascript - 角度错误:Webpack 已使用与 API 模式不匹配的配置对象进行初始化
- mysql - 如何在 MySQL 中进行 2 个查询的交集
- html - 位置粘性与 z-index 结合
- css - 有没有办法构建一个三重边界,中间和最里面的边界线只跨越四个角中的两个?
- dart - Flutter:只显示图像的特殊部分
- macros - 匹配封闭函数的返回类型
- javascript - 使用 Webpacker 在 Rails 应用程序中渲染 ReactJS CRUD 组件的问题
- android - 有没有办法在安卓上检查电子邮件域的有效性?
- java - Hibernate 将 null 而不是使用来自 posrgresql 的序列