Home > Net >  How to create a bash script to make directories and specific files inside each directory
How to create a bash script to make directories and specific files inside each directory

Time:07-15

I wrote a bash script trying to generate one directory named after each file inside the directory from which I run the script.

Original directory= /home/agalvez/data//sims/phylip_format

sim1.phylip
sim2.phylip

Directories to create = sim1 sim2

The contents of these new directories should be a copy of the original file that names the new directory and an extra file called "input". This file should contain the name of the .phylip file as well as the following:

"Name of original file"
U
5
Y
/home/agalvez/data/sims/trees/tree_nodenames.txt

After that I want to run the following command (sequentially) in all these new directories:

phylip dollop < input > screenout

My approach is the following one but it is not working:

!/bin/bash

for f in *.phylip;
 mkdir /home/agalvez/data/sims/dollop/$f;
 cp $f /home/agalvez/data/sims/dollop/$f;
 cd /home/agalvez/data/sims/dollop/$f;
 echo "$f" | cat > input;
 echo "U" | cat >> input;
 echo "5" | cat >> input;
 echo "Y" | cat >> input;
 echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input;
 phylip dollop < input > screenout;
;done


Edit: The error messge looks like this:

line 4: syntax error near unexpected token `mkdir'
line 4: ` mkdir /home/agalvez/data/sims/dollop/$f;'

FINAL SOLUTION:

#!/bin/bash

for f in *.phylip; 
 do
 mkdir /home/agalvez/data/sims/dollop/$f;
 cp /home/agalvez/data/sims/phylip_format/$f /home/agalvez/data/sims/dollop/$f;
 cd /home/agalvez/data/sims/dollop/$f;
 echo "$f" | cat > input;
 echo "U" | cat >> input;
 echo "5" | cat >> input;
 echo "Y" | cat >> input;
 echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input;
 phylip dollop < input > screenout;
done


CodePudding user response:

The immediate problem is that you are lacking a do at the beginning of the loop body; but you'll want to refactor this code to avoid hardcoding the directory structure etc.

The first line needs to start with literally the two characters # and ! in order to be a valid https://en.wikipedia.org/wiki/Shebang_(Unix)

Notice also When to wrap quotes around a shell variable?

The printf could be replaced with a here document; I like the compactness of printf here.

#!/bin/bash

for f in *.phylip; do
    mkdir -p dollop/"$f"
    cp "$f" dollop/"$f"
    cd dollop/"$f"
    printf "%s\n" "$f" "U" "5" "Y" \
        "/home/agalvez/data/sims/trees/tree_nodenames.txt" |
    phylip dollop > screenout
done

CodePudding user response:

Assuming you have a directory named pingping in your ${HOME} folder with files 1.txt, 2.txt, 3.txt. You can accomplish that like this. Modify this code to suit your needs.

#! /bin/bash

working_directory="${HOME}/pingping/"

cd $working_directory

for f in *.txt
do
    mkdir "${f%%.*}"
    if [ -f "${f%%.*}.txt" ]
    then
        if [ -d "${f%%.*}" ]
        then
            cp ${f%%.*}.txt ${f%%.*}
            echo "Done copying"
            #phylip dollop < input > screenout
            #echo "Succesfully ran the command
        fi
    else
        echo "not found"
    fi

done
    
  •  Tags:  
  • bash
  • Related