我在一个目录中有几个PNG图像,我正在使用optipng
来优化和减小图像大小。问题是优化所有文件需要很长时间。
有一个四核处理器,我注意到optipng
只使用一个核当我优化目录时。
这是我正在使用的代码:
ls -1 | while read line
do
optipng -o7 "$line"
done
是否可以在读取目录时并行执行四个不同文件的optipng
?
还有另一种解决方案涉及xargs
。
find some/dir/ -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7
其中-P 4
启动 4 个并行进程,-n 1
每个进程最多使用一个文件名。
或者,如果您有换行符分隔的文件名,请使用:
find some/dir/ -iname '*.png' | sort | xargs -d \n -n 1 -P 4 optipng -o7
感谢Joe Lencioni在博客上的评论。
更新:我编写了一个 shell 脚本来并行调用多个图像的 zopflipng(它提供了比 optipng 更高的压缩):zopflipng_in_place
我将optipng与GNU parallel一起使用(包含在每个Linux发行版中):
parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png
优点:您有一个指示进度的条形图。
将每个optipng
放在后台才能使用四个内核,并使用计数器n
来跟踪它们的数量。在这种情况下,我使用的是n=4
,因此在给定时间将运行 4 个后台作业:
n=0
for image in *
do
optipng -o7 "$image" &
n=$(( $n + 1 ))
[ "$n" -eq 4 ] && n=0 && wait
done
不要同时运行许多 bg 作业(保持低n
),否则会有性能损失。根据需要修改代码,尤其是 for image in *
中的*
模式。