对多个目录并行执行bash脚本

时间:2019-10-29 16:51:10

标签: bash gnu-parallel

如果我有一个bash脚本(chunks.sh)可以并行执行几个小型脚本,我想知道如何正确执行chunks.sh,以便它可以对许多文件夹并行运行?我大约有1000个文件夹,其中包含需要处理的文件。这是我的脚本:

#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --time=16:00:00
#SBATCH --output=mpi_output_%j.txt
#SBATCH --mail-type=FAIL

cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

parallel -j 10 < ../1convertfiles.sh
parallel -j 10 < ../2sortfiles.sh
parallel -j 10 < ../3indexfiles.sh
parallel -j 10 < ../4converttopile.sh
parallel -j 10 < ../5createconsensus.sh
parallel -j 10 < ../6concatenateconsensus.sh

每个文件夹都有一个名称,例如THAKID0001_dir,THAKID0010_dir等。因此,我想知道如何在此脚本中正确应用命令以遍历当前目录,找到所有带有* _dir的目录,然后执行所有这些迷你目录。该目录中的脚本?

我尝试将并行命令放入for循环中,但它多次重新运行了迷你脚本。我想我可以使用:

parallel -j 10 < 1convertfiles.sh ::: *_dir/*  
parallel -j 10 < 2sortfiles.sh ::: *_dir/*
etc.

但是对我来说,这种逻辑似乎不会同时为SAME目录运行每个并行命令块。每个并行行都会找到它自己的目录才能工作,并且这些微型脚本必须按顺序运行,因此为什么我尝试编写一个for循环却造成了巨大混乱。

预期结果:

 $ ./chunks.sh
 ### Should run the list of commands per folder ###
 ### For example, it will execute all the parallel commands in THAK0001_dir then it will execute all the parallel commands in THAK0002_dir, etc ####

TL; DR:如何使chunk.sh对具有特定标记(即THAK * _dir)的所有目录执行这些并行命令块,但每行应在上一行完成后运行。希望这有道理..谢谢!

1 个答案:

答案 0 :(得分:1)

表面上,该问题需要执行顺序处理的帮助程序脚本:

$ SLURM_SUBMIT_DIR中的process-dir.sh

#! /bin/bash
# Process all jobs for current folder, sequentially.
# Input: Folder, e.g. THAKID0001_dir
cd $1
../1convertfiles.sh
../2sortfiles.sh
../3indexfiles.sh
../4converttopile.sh
../5createconsensus.sh
../6concatenateconsensus.sh

然后并行运行

#! /bin/bash
cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

parallel -j10 process-dir.sh ::: *_dir

或者通过直接包含bash函数来避免文件process-dir.sh

#! /bin/bash
cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

process-dir() {
  # Process all jobs for current folder, sequentially.
  # Input: Folder, e.g. THAKID0001_dir
  cd "$1"
  ../1convertfiles.sh
  ../2sortfiles.sh
  ../3indexfiles.sh
  ../4converttopile.sh
  ../5createconsensus.sh
  ../6concatenateconsensus.sh
}
export -f process-dir

parallel -j10 process-dir ::: *_dir