less than 1 minute read

在某些任务中,需要在terminal执行大量重复且相似的bash指令,这些指令大多不会过于复杂,而是需要重复劳动。

此类任务有两种主要的解决方案:通过一个for循环脚本来一键式执行命令、通过并行化方式来以多核方式执行指令。使用for循环的优势是简单易于理解,缺点也很明显,对于任务之间无关联关系的指令无法并行处理;而第二种方法则与前者相反,不易理解但执行效率高,可以充分利用多核处理器的性能优势。

接下来主要介绍我使用的 GNU Parallel 这个命令行软件。

GNU Parallel 其官方定位是 a shell tool for executing jobs in parallel using one or more computers(一个可以在单台/多台计算机上并行执行任务的shell工具)。我这里只使用到了他最基本的功能,并行执行shell脚本中已经定义好的指令(指令的生成可另外翻阅资料)。

首先是安装,Parallel 目前支持绝大多数常见 Unix-like 系统如 BSD、Centos、Ubuntu、MacOS,不支持 Windows。这里以 Conda 环境为例,直接执行下列命令即可完成安装。

conda install -c conda-forge parallel

生成一个 shell 脚本 test.sh ,内容如下所示:

mkdir A
mkdir B
mkdir C
mkdir D
mkdir E
mkdir F
mkdir G
mkdir H
mkdir I
mkdir J
mkdir K
mkdir L
mkdir M
mkdir N
mkdir O

接下来执行以下命令

cat test.sh | parallel -j4 {}

-j4 是使用4个核心来并行处理,可根据自己的设备来修改。等待执行完毕即可。

这是我最常使用的方式,也可以去其官网查看更加详细的使用方法,其中列出了很多高级用法,这里不再赘述。