我有一个脚本,它遍历文件夹结构中的JPG文件来处理它们。
为了加快速度,我将处理任务分为以下几个部分:
#!/bin/sh
SECONDS=0 #Start the clock!
myloop () {
local run=$1
jpeg-transform "$file"
stripexif "$file"
...other commands...
}
find /user/dan/testjpgs -name '*.jpg' -print0 | while read -d $' ' file
do myloop "$run" & #fork myloop
done
duration=$SECONDS
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
问题是,脚本结束时的持续时间计算是在脚本执行后立即进行的。它不等待子进程完成,只返回"已过零秒"。
我试过在do…done循环之后插入一个"wait"命令,但没有任何效果。
我使用GNU并行命令解决了这个问题,效果很好,还可以将子进程扩展到可用CPU核的数量。我确信这本可以在纯粹的狂欢中完成,但对我来说这看起来更优雅。
#!/bin/sh
SECONDS=0 #Start the clock!
myloop () {
command
command
command
}
export -f myloop
find . -name '*.jpg' | parallel myloop {}
duration=$SECONDS
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."