相关文章推荐
坚韧的板栗  ·  Android ...·  1 年前    · 
霸气的小熊猫  ·  dockerfile 获取build ...·  1 年前    · 
打篮球的作业本  ·  (转) ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am writing a shell script to run under the KornShell (ksh) on AIX. I would like to use the mkdir command to create a directory. But the directory may already exist, in which case I do not want to do anything. So I want to either test to see that the directory does not exist, or suppress the "File exists" error that mkdir throws when it tries to create an existing directory.

How can I best do this?

Note that this will also create any intermediate directories that don't exist; for instance,

mkdir -p foo/bar/baz

will create directories foo, foo/bar, and foo/bar/baz if they don't exist.

Some implementation like GNU mkdir include mkdir --parents as a more readable alias, but this is not specified in POSIX/Single Unix Specification and not available on many common platforms like macOS, various BSDs, and various commercial Unixes, so it should be avoided.

If you want an error when parent directories don't exist, and want to create the directory if it doesn't exist, then you can test for the existence of the directory first:

[ -d foo ] || mkdir foo
                the shortened example you use is exactly what you should not do.  It is reversing the logic to save coding space but it should use ! and && and make more sense to those reading it.
– Mike Q
                Jun 16, 2014 at 17:36
                @AndreasLarsen This question is about mkdir on Unix-like systems, not on Windows. -p is required for POSIX/Single Unix Specification compliance, so anything that intents to comply with those specifications will support -p. Windows is entirely different, unless you use a POSIX emulation layer like Cygwin or MSYS.
– Brian Campbell
                Oct 9, 2014 at 15:54
                I discovered something interesting today with mkdir -p, you can use brackets! {} to create "complex" directory tree in a command. See here: technosophos.com/2010/04/15/…
– herve
                Feb 4, 2016 at 11:13
                @MikeQ I 'd prefer || instead of && because then the whole line has the right exit status. Important if your shell runs with errexit or if that line is the last one in a function, switch-case, whatever.
– rudimeier
                Mar 13, 2016 at 15:42
                @herve That has nothing to do with mkdir; the shell expands such an expression to a discrete list of argument that are passed to mkdir.
– chepner
                Oct 31, 2017 at 20:33
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2

which will create the directory if it doesn't exist, but warn you if the name of the directory you're trying to create is already in use by something other than a directory.

I don't think there's a -d operator in korn, rather -e is used for both files / directories and just checks existence. Also, they all return 0 upon success, so ! is redundant. Correct me if I'm wrong. – alkar Apr 27, 2009 at 14:57 wrong on both counts, AFAIK. tests return true on success, and -d exists too (at least on MacOS X) – Alnitak Apr 27, 2009 at 14:58 it might be worth mentioning that this isn't quite thread-safe. between the time that you check if the directory exists and the time you try to write, things might change. – Justin L. Mar 12, 2015 at 1:27 Keep in mind that this is not a feature of mkdir itself, but the shell that executes the command. It's called brace expansion - AFAIK, only Bash, ksh, zsh, and the C shell support it. – Daniel Kamil Kozar May 24, 2016 at 18:49 @Atlas7 stated, you will need to escape characters that are normally part of regex. (i.e. instead of using folder name you need to use folder\ name) – John Hamilton Jan 19, 2018 at 6:30 This is not an answer; this is a separate topic that would be more appropriate as a comment. – Chris Page Nov 2, 2019 at 23:28 @PeterMortensen : Of course. Use mkdir -p if you do not want race conditions. But you won't get to show your own Directory exists error. – Jahid Jun 13, 2020 at 9:39

mkdir foo works even if the directory exists. To make it work only if the directory named "foo" does not exist, try using the -p flag.

Example:

mkdir -p foo

This will create the directory named "foo" only if it does not exist. :)

As mentioned by @BrianCampbell, this will also create any other directories in the path. This can be dangerous if e.g. a volume becomes unmounted, as it may create directories in the mount point. – uliwitness Apr 22, 2015 at 16:50 @Peter, a snippet like (for example) [ -d newdir ] || mkdir newdir, where the directory does not initially exist, has a race condition in that, between the test for existence and the attempted creation, another process could swoop in and create the directory. Hence the mkdir would then fail. – paxdiablo Jun 13, 2020 at 3:18 @Mike Q: the base path /tmp has likely been chosen in the example to represent a base-path that always exists and is write-able to the current user, e.g. the user has enough rights to create a directory in. You raise a valid point thought:: the logic is a bit contradictory, as when this command fails, it can mean two things: 1.) the directory exists or 2.) the directory could not be created. This is not true for the operation itself, therefore a simple post-check on the directory path can give the confirmation, or the next command that operates on. – hakre Jun 25, 2021 at 20:46 mkdir -p my/new/dir does not complain if my/new/dir already exists, no need to redirect output – Leevi L Jan 21, 2022 at 11:08 Typo fixed. Leevi, I believe I ran into a situation where the output needed to be squelched. – moodboom Jan 21, 2022 at 15:20 Does mkdir -p /parent/dir complain if permissions prevent creating /parent/dir ? If so, perhaps the redirection might be considered "deadly" or at least unwise. – WGroleau Nov 20, 2022 at 0:04

You can either use an if statement to check if the directory exists or not. If it does not exits, then create the directory.

  • dir=/home/dir_name

    if [ ! -d $dir ]
         mkdir $dir
         echo "Directory exists"
    
  • You can directory use mkdir with -p option to create a directory. It will check if the directory is not available it will.

    mkdir -p $dir
    

    mkdir -p also allows to create the tree structure of the directory. If you want to create the parent and child directories using same command, can opt mkdir -p

    mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
                    I have shared you ways of creating the folders when an folder does not exists. It depends upon the requirement on the one. If you have a use case where you need to check if folder does not exist and you want to keep track of that so you can go with solution 1. If it does not matter, you can go with solution 2, it will create the folder if not exists.
    – AbhinavVaidya8
                    Sep 2, 2018 at 3:19
    

    This is a simple function (Bash shell) which lets you create a directory if it doesn't exist.

    #------------------------------------------#
    # Create a directory if it does not exist. #
    #------------------------------------------#
    # Note the "-p" option in the mkdir        #
    # command which creates directories        #
    # recursively.                             #
    #------------------------------------------#
    createDirectory() {
       mkdir -p -- "$1"
    

    You can call the above function as:

    createDirectory "$(mktemp -d dir-example.XXXXX)/fooDir/BarDir"

    The above creates fooDir and BarDir if they don't exist. Note the "-p" option in the mkdir command which creates directories recursively.

    which will create all directories in a given path, if exists throws no error otherwise it creates all directories from left to right in the given path. Try the below command. the directories newdir and anotherdir doesn't exists before issuing this command

    Correct Usage

    mkdir -p /tmp/newdir/anotherdir

    After executing the command you can see newdir and anotherdir created under /tmp. You can issue this command as many times you want, the command always have exit(0). Due to this reason most people use this command in shell scripts before using those actual paths.

    Improvement on the 'classic' solution (by Brian Campbell) - to handle the case of symlink to a directory.

    [ -d foo/. ] || mkdir foo
    
    if [ !-d $dirName ];then
         if ! mkdir $dirName; then  # Shorter version. Shell will complain if you put braces here though
         echo "Can't make dir: $dirName"
    
  •