如果我有一个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)的所有目录执行这些并行命令块,但每行应在上一行完成后运行。希望这有道理..谢谢!
答案 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