如何在 linux 中的每个目录上为 运行 生成不同的脚本?

How to generate different scripts to run on each directory in linux?

我有一个目录 main,其中大约有 100 个目录。例如,它如下所示:

main
 |__ test_1to50000
 |__ test_50001to60000
 |__ test_60001to70000
 |__ test_70001to80000
 |__ test1.sh

我在第一个目录上有一个 test1.sh 到 运行 的批处理脚本。

#!/bin/bash

#SBATCH --job-name=sbatchJob   
#SBATCH --cpus-per-task=16       
#SBATCH --mem-per-cpu=8G    
#SBATCH --time=1-00:00:00
#SBATCH --qos=1day
if [ -f ~/.bashrc ] ; then
    . ~/.bashrc
fi

module load Perl/5.28.0-GCCcore-8.2.0

perl path/to/software --cpu 16 --run /path/to/test_1to50000 command /path/to/test_1to50000/software.`date +"%m_%d_%y_%H-%M-%S"`.log

我有100个目录,所以我想为每个目录创建每个脚本并提交脚本。如何为上面的所有其他目录生成 sbatch scripts

您最好的选择是使用 job array 和这样的脚本:

#!/bin/bash
#SBATCH --array=0-3   # 3 == number of dirs - 1
#SBATCH --job-name=sbatchJob   
#SBATCH --cpus-per-task=16       
#SBATCH --mem-per-cpu=8G    
#SBATCH --time=1-00:00:00
#SBATCH --qos=1day
if [ -f ~/.bashrc ] ; then
    . ~/.bashrc
fi

module load Perl/5.28.0-GCCcore-8.2.0
DIRS=(main/*/)    # This array will hold all directories
CURRDIR="${DIRS[$SLURM_ARRAY_TASK_ID]}" # This is the directory taken care of by the current job

perl path/to/software --cpu 16 --run "$CURRDIR" command "$CURRDIR"/software.`date +"%m_%d_%y_%H-%M-%S"`.log

这将创建一个作业数组,每个目录一个作业。您需要在数组中设置正确数量的作业以对应于目录数量。但是,有了数组,您可以使用一个命令管理所有作业,在所有作业完成后收到一封电子邮件,这大大简化了调度程序的工作。