3

Issue at hand

I am trying to write a bash script to quickly create a directory structure. This is an attempt to learn more about manipulating arrays, variables, and using loops. My script works to check for the existence of a directory then create folders. The issue I am having is creating a third level of directories within the first two layers.

Goals

I want to be able to write a bash script that will create a directory structure of ~/a/a/a, ~/a/a/b, ~/a/a/c,...,~/a/z/z for example. This should be flexible to so I could use any kind of array or variable that would be suitable.

Here is what I have worked out so far:

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

if [ ! -d "directory" ]; then
    mkdir directory
fi
for array_0 in "${array_0[@]}"
do
    mkdir ~/directory/$array_0/
done
if [ -d "~/directory/$array_0/" ]; then
   for array_1 in "${array_0[@]}"
   do
       mkdir ~/directory/$array_0/$array_1
   done
fi
exit 0

Problem

The error I get is mkdir: cannot create directory '/home/user/directory/one/x' : No such file or directory

Other attempts at this script allow me to create ~/directory and ~/directory/one, ~/directory/two,..., ~/directory/five without fail but not the next level i.e /directory/one/x and etc.

How can I script the creation of this directory structure? Is this possible using arrays or is there another method?

For reference I tried to implement this post and elements from this post but I have not had any luck creating the directory structure that I want.

17
  • 2
    mkdir -p will create all required directories. For example you can do mkdir -p one/two/three/four/five and it will create all the directories required (if they don't exist) in order to make five
    – jesse_b
    Commented Feb 26, 2018 at 20:33
  • for array_0 in "${array_0[@]}" Oops. Commented Feb 26, 2018 at 20:33
  • @ikkachu I posted the error, also that reference was a mistake. The script you see if the actual script this is simply an exercise in learning bash scripts.
    – kemotep
    Commented Feb 26, 2018 at 20:43
  • 1
    @kemotep, the script has x in array_1[0], but the first time array_1 is referenced after the assignment is when array_1 is used to loop over the values of array_0. So no, it doesn't look like that script would try to create directory/one/x, or otherwise lead to that error...
    – ilkkachu
    Commented Feb 26, 2018 at 22:04
  • This question has multiple problems.  It is, of course, OK to post non-functioning scripts in questions, but it is not OK to post one version of a script along with an error message that comes from a different (unpublished) version of the script. Commented Apr 3, 2018 at 17:21

1 Answer 1

5

You could use a nested array loop, like this

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

for a0 in "${array_0[@]}"
do
   for a1 in "${array_1[@]}"
   do
       mkdir -p "$HOME/web/$a0/$a1"
   done
done

Or, if you don't mind avoiding the use of arrays but using expansion lists instead, this single command will do much the same thing:

mkdir -p ~/web/{one,two,three,four,five}/{x,y,z}
2
  • I did not know you could do this in a one-liner. I just learned of arrays and thought that they would help. Your mkdir -p ~/{one,two,three,four,five}/{x,y,z} example works great. Thank you, I was making this too complicated.
    – kemotep
    Commented Feb 26, 2018 at 20:48
  • @kemotep there's definitely a time and place for arrays so don't worry about this not necessarily being one of them. Commented Feb 26, 2018 at 21:40

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.