How to run multiple programs in a sequence using a bash script?
27 06 18 • 02:11& Filed in: Coding
How to write a bash script that goes through each subdirectory inside a parent_directory and executes a command in each subdirectory?
Suppose there are 10 subdirectories inside a parent_directory with the following structure:
***parent_directory (name could be anything - doesn't follow a pattern)
— subdir1 (subdirectory names follow a specific pattern, e.g. fixed characters + number)
input.data (input of the code)
code.f (main code, here is a Fortran code)
Makefile (makefile to execute and run the code)
— subdir2
input files + codes + Makefile
— subdir3
input files + codes + Makefile
.
.
.
— subdir10
Suppose we want to run the codes in the first five subdirectories, i.e. subdir1-subdir5, wait for the processes to finish and then continue running the codes in the next five subdirectories, i.e. subdir6-subdir10.
The example of the bash script is as (download the bash script file
You can run the bash script (called "run.sh") by:
Suppose there are 10 subdirectories inside a parent_directory with the following structure:
***parent_directory (name could be anything - doesn't follow a pattern)
— subdir1 (subdirectory names follow a specific pattern, e.g. fixed characters + number)
input.data (input of the code)
code.f (main code, here is a Fortran code)
Makefile (makefile to execute and run the code)
— subdir2
input files + codes + Makefile
— subdir3
input files + codes + Makefile
.
.
.
— subdir10
Suppose we want to run the codes in the first five subdirectories, i.e. subdir1-subdir5, wait for the processes to finish and then continue running the codes in the next five subdirectories, i.e. subdir6-subdir10.
The example of the bash script is as (download the bash script file
):#!/bin/bash
## exit on the first error.
set -e
# Add the full path of parent_directory to run the codes in the subdirectories
path=$(pwd)
## just for checking the path of the parent_directory
echo path= $path
## the min and the max values of the int variable i, changing from 1 to 5
i=1
imax=5
## do loop from i to imax
while [ $i -le $imax ]; do
## path of each subdirectory defined as "subdir" + integer i
pathi=$path/subdir$i
## just for checking the path of each subdirectory
echo pathi= $pathi
## cd to each subdirectory of the loop
cd $pathi
## compile and run the code in each subdirectory using Makefile ("Main" is the executable file)
make -f Makefile
nohup ./Main &
## adding the counter
let i=i+1
done
## Wait for the processes to finish
wait
i=6
imax=10
## do loop from i to imax
while [ $i -le $imax ]; do
## path of each subdirectory defined as "subdir" + integer i
pathi=$path/subdir$i
## just for checking the path of each subdirectory using Makefile ("Main" is the executable file)
echo pathi= $pathi
## cd to each subdirectory of the loop
cd $pathi
## compile and run the code in each subdirectory
make -f Makefile
nohup ./Main &
## adding the counter
let i=i+1
done
You can run the bash script (called "run.sh") by:
$ bash run.sh