2

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
    Feb 26, 2018 at 20:33
  • for array_0 in "${array_0[@]}" Oops. 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
    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
    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. Apr 3, 2018 at 17:21

1 Answer 1

2

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 ~/{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
    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. Feb 26, 2018 at 21:40

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .