我经常发现自己编写简单的for循环来对许多文件执行操作,例如:
for i in `find . | grep ".xml$"`; do bzip2 $i; done
看起来有点令人沮丧的是,在我的4核机器上只有一个核心被使用..有一种简单的方法可以为我的shell脚本添加并行性吗?
编辑:为我的问题介绍更多的背景,对不起,我开始时并不是更清楚!
我经常想在合理大小的数据集(通常在100到10,000之间)上运行简单(ish)脚本,例如绘制图形,压缩或解压缩,或运行某些程序.我用来解决这些问题的脚本看起来像上面那样,但可能有不同的命令,甚至是一系列要执行的命令.
例如,刚才我正在运行:
for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
所以我的问题绝不是特定于bzip的!(虽然并行bzip确实看起来很酷,但我打算将来使用它).
解决方案:使用xargs
并行运行(不要忘记-n
选项!)
find -name \*.xml -print0 | xargs -0 -n 1 -P 3 bzip2
这个perl程序可以很好地满足您的需求,您只需这样做:
runN -n 4 bzip2 `find . | grep ".xml$"`