0

我有很多包含 .sh 文件的文件夹(如下所示)。我需要在集群上运行它们中的每一个。我需要有关如何将以下 sbatch 命令放入循环的帮助。

cd file1
sbatch run_min.sh
sbatch run_eqbr.sh 
sbatch run_prod.sh
cd ..



 cd file2
    sbatch run_min.sh
    sbatch run_eqbr.sh 
    sbatch run_prod.sh

文件夹结构

 folder1
     run_min.sh 
     run_eqbr.sh
     run_prod.sh

    folder2 
     run_min.sh
     run_eqbr.sh
     run_prod.sh

    folder3 
     run_min.sh
     run_eqbr.sh
     run_prod.sh

    folder4 
     run_min.sh
     run_eqbr.sh
     run_prod.sh
4

2 回答 2

0

这行得通。

for dir in */; 
do sbatch run_min.sh;
sbatch run_eqbr.sh
sbatch run_prod.sh ; done
于 2019-11-19T01:34:18.580 回答
0

尝试这个。

for folder in ./*/; do
  ( cd "$folder"
    for file in ./*; do
      sbatch "$file"
    done )
done

括号导致cdetc 在子 shell 中运行,因此您不必cd在每个之后都返回(当目标目录是符号链接时,这在某些情况下可能会失败)。

如果文件不需要在特定目录中运行,也许只是

for file in ./*/*; do
    sbatch "$file"
done

熟练编写的脚本不关心它们从哪个目录运行,但当然,这些可以是简单的临时脚本,例如期望特定的输入数据文件存在于当前目录中。

如果您不能只运行所有目录中的所有文件,则可以将通配符更改为./*/*.sh或显式循环特定文件名:

for folder in ./*; do
  for name in min eqbr prod; do
    sbatch "$folder/run_$name.sh"
  done
done

同样,如果脚本要求您cd进入每个文件夹,您可以将其与第一个示例中的代码结合使用。

于 2019-11-19T01:43:20.600 回答