How to Run Mkdir Only When the Directory Does Not Exist
- the
mkdirCommand and Its Purpose - Create Directories With
mkdir - Create Directories With
mkdirOnly When They Don’t Exist - Use
mkdirWith anifControl Structure
This article talks about mkdir and its usage in creating directories. It further discusses ways to use mkdir when the directory we want to make does not exist.
the mkdir Command and Its Purpose
The mkdir command in Unix/bash stands for make directory. It allows users to make folders, set permissions, and much more.
The user executing the mkdir command must have sufficient privileges to create a directory in the path specified, or the user may get a permission denied error.
Create Directories With mkdir
The general syntax for mkdir is as follows:
mkdir <specified_option> directory_name sudo mkdir <specified_option> directory_name # in case user doesn’t have permissions mkdir also allows the creation of multiple directories at once. To do so, add comma-separated directory names within curly brackets.
Ensure that you do not include extra spaces in the directory names, or the directories will include the spaces in their names. The command below demonstrates what we said:
mkdir {dir1,dir2,dir3} # here directory names are dir1, dir2 and dir3 
Create Directories With mkdir Only When They Don’t Exist
One issue when using mkdir is an error when the directory one is trying to create already exists. It is not much of a problem running the bash command as mkdir makes a directory if it does not exist; otherwise, it just gives an appropriate error.
However, there’s a twist. Suppose you’re trying to code a custom bash shell and don’t want mkdir to give an error when trying to recreate an existing file. Then what do you do?
We will explain several ways to prevent the above.
[[ -d dir_name ]] || mkdir dir_name # option 1 mkdir -p dir_name # option 2 mkdir dir_name 2>/dev/null # option 3 
The first option and third options are more recommended than the second one, as the second one might run into race conditions during concurrent execution. As for the third one, it redirects the output of stderror to a file dev/null.
If you have studied operating systems, there is a concept of the ppfdt table (process file descriptor table). Recall that by default, the zero descriptor points to stdin, one descriptor points to stdout, and two descriptor points to stderror.
/dev/null is a null device file, which will discard anything and everything written to it and return an end-of-file character on being read. It is like a vacuum, which will suck anything thrown into it.
That being said, here you can redirect stderror to any unused file of your choice, but /dev/null is more recommended.
Use mkdir With an if Control Structure
Another way to do it could revolve around using an if control structure. You could check if the directory exists and if it doesn’t, then proceed to create it; otherwise, do nothing.
The below script elaborates on it:
if [ ! -d dir_name ]; then mkdir dir_name; fi 