使用GNU parallel来并行化bash for循环

rob*_*anf 3 python unix gnu-parallel

我有一个for循环,在100个不同的输入文件夹上运行一个Python脚本~100次.python脚本在2个内核上最有效,我有50个内核可用.所以我想使用GNU parallel一次在25个文件夹上运行脚本.

这是我的for循环(工作正常,但当然是顺序的),python脚本需要一堆输入变量,包括-p 2在两个核心上运行它:

for folder in $(find /home/rob/PartitionFinder/ -maxdepth 2 -type d); do
        python script.py --raxml --quick --no-ml-tree $folder --force -p 2
done
Run Code Online (Sandbox Code Playgroud)

这是我尝试并行化它,这是行不通的:

folders=$(find /home/rob/PartitionFinder/ -maxdepth 2 -type d)

echo $folders | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2
Run Code Online (Sandbox Code Playgroud)

我遇到的问题(也许它只是众多的第一个)是我的folders变量不是一个列表,所以它实际上只是传递一个长100个文件夹的字符串作为{}脚本.

感谢所有提示.

use*_*342 5

替换echo $folders | parallel ...echo "$folders" | parallel ....

如果没有双引号,shell会解析空格$folders并将它们作为单独的参数传递给它们echo,这会导致它们打印在一行上.parallel提供每一行作为作业的参数.

为了完全避免上述报价的问题,它始终是一个好主意,管findparallel直接,使用空字符作为分隔符:

find ... -print0 | parallel -0 ...
Run Code Online (Sandbox Code Playgroud)

即使遇到包含多个空格或换行符的文件名,这也会起作用.