我发现将数百万张这样的图片转换为另一种格式的最佳方法是创建一个简单的bash脚本,开始转换它发现的所有图片,就像下面列出的那个:
要编辑此bash脚本,我使用nano。如果没有nano: "apt-get install nano
" 适用于Ubuntu/Debian 或 "yum install nano
"适用于CentOS/CloudLinux. 对于其他发行版:请使用Google搜索) 但您可以自由选择任何编辑器。
Bash脚本
首先,通过启动您喜欢的编辑器(我的是nano
)来创建bash脚本:
nano -w ~/imgconv.sh
然后用这段内容填充它:
#!/bin/bash
find ./ -type f -iname "*.jpeg" -exec mogrify -verbose -format jpeg -layers Dispose -resize 1024\>x1024\> -quality 75% {} +
find ./ -type f -iname "*.jpg" -exec mogrify -verbose -format jpg -layers Dispose -resize 1024\>x1024\> -quality 75% {} +
find ./ -type f -iname "*.png" -exec mogrify -verbose -format png -alpha on -layers Dispose -resize 1024\>x1024\> {} +
然后您只需要使用 chmod +x ~/imgconv.sh
将其变为可执行文件,并从您想要调整大小的所有子目录中的主要图像目录运行它:
cd /var/www/webshop.example.com/public_html/media/
~/imgconv.sh
这应该会开始转换过程。
说明
脚本的工作原理是使用find查找任何大小写的扩展名为.jpeg
的文件,然后运行一个命令:
find ./ -type f -iname "*.jpeg" -exec <COMMAND> {} +
然后使用"-exec {} +"参数执行适当的转换作业:
mogrify -verbose -format jpeg -layers Dispose -resize 1024\>x1024\> -quality 75% <### the filename goes here, in this case *.jpeg ###>
如果您正在处理比今天更早的文件,并且希望避免重新转换您已经在今天转换过的文件,甚至可以使用 -mtime +1
选项告诉“find”命令只转换早于今天的文件,示例如下:
#!/bin/bash
find ./ -type f -mtime +1 -iname "*.jpeg" -exec mogrify -verbose -format jpeg -layers Dispose -resize 1024\>x1024\> -quality 75% {} +
find ./ -type f -mtime +1 -iname "*.jpg" -exec mogrify -verbose -format jpg -layers Dispose -resize 1024\>x1024\> -quality 75% {} +
find ./ -type f -mtime +1 -iname "*.png" -exec mogrify -verbose -format png -alpha on -layers Dispose -resize 1024\>x1024\> {} +
性能
使用更多核心进行此过程的一个非常简单的方法是在每行后面添加&
,将每个作业分叉到后台。另一种方式是使用GNU Parallel,特别是使用-X参数,它将使用所有CPU核心并快速完成作业。
但无论你使用什么类型的并行化技术,请确保只在你自己的系统上执行操作,而不要在共享磁盘系统上执行操作,因为追求最大性能会拖慢你的硬件或虚拟机性能。
这项工作需要一段时间,所以请务必提前设置一个没有超时/空包的屏幕或终端。在我的系统上,它每分钟处理约5000个文件,因此整个作业应该不到50-60小时...听起来像是在周末运行的好作业。
只需通过编写单独的命令将所有文件扩展名彼此分开即可。把所有选项堆叠在一起,并让'mogrify'对所有图像格式使用所有选项是行不通的。
ImageMagick是一个强大的工具,有了正确的使用方式。