我在目录中有几个PNG图像,我正在使用optipng
来优化和缩小图像大小。问题是优化所有文件需要很长时间。
我有一个四核处理器,我注意到optipng
只使用了一个核心
当我优化目录时。
这是我正在使用的代码:
ls -1 | while read line
do
optipng -o7 "$line"
done
是否可以在读取目录时并行执行optipng
四个不同文件?
答案 0 :(得分:9)
还有另一个涉及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 comment on a blog。
更新:我编写了一个shell脚本来调用zopflipng(它提供比optipng更高的压缩率)并行处理多个图像:zopflipng_in_place
答案 1 :(得分:4)
您需要将每个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 *
模式。
答案 2 :(得分:2)
我使用optipng和 GNU parallel (包含在每个linux发行版中):
parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png
优点:你有一个指示进度的栏。