The*_*ker 4 linux bash terminal image do-while
我在目录中有几个PNG图像,我optipng用来优化和减少图像大小.问题是优化所有文件需要很长时间.
我有一个四核处理器,我注意到optipng在优化目录时只使用了一个核心.
这是我正在使用的代码:
ls -1 | while read line
do
optipng -o7 "$line"
done
Run Code Online (Sandbox Code Playgroud)
optipng在读取目录时是否可以并行执行四个不同的文件?
还有另一种解决方案xargs.
find some/dir/ -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7
Run Code Online (Sandbox Code Playgroud)
其中,-P 4启动4个并行进程,-n 1每个进程最多使用一个文件名.
或者,如果您有换行符分隔的文件名,请使用:
find some/dir/ -iname '*.png' | sort | xargs -d \\n -n 1 -P 4 optipng -o7
Run Code Online (Sandbox Code Playgroud)
更新:我编写了一个shell脚本来为多个图像并行调用zopflipng(比optipng提供更高的压缩率):zopflipng_in_place
我将 optipng 与GNU 并行(包含在每个 linux 发行版中)一起使用:
parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png
Run Code Online (Sandbox Code Playgroud)
优点:您有一个指示进度的栏。
小智 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
Run Code Online (Sandbox Code Playgroud)
不要同时运行许多 bg 作业(保持n较低),否则会降低性能。根据需要修改代码,尤其*是for image in *.