52

Is there a flag/option for touch, mkdir, >, or some other command that will allow me to create a file and any non-existent parent directories at the same time?

For instance, let's say I'm in an empty folder. Now I can create parent directories if they don't exist when creating a folder

mkdir -p nested/folder

I can create files in existing directories

touch nested/folder/something.txt

But I can't create a file in a directory that doesn't exist yet

touch nested/folder/deep/more.txt

touch: cannot touch ‘nested/folder/deep/more.txt’: No such file or directory

How would I create that deep folder at the same time I create more.txt ?

1
40

You can combine the two commands on a single line. If you use a variable you can do this:

file="./nested/folder/deep/more.txt"

And then this:

mkdir -p "${file%/*}" && touch "$file"

Or all together on one line like this:

mkdir -p "./nested/folder/deep" && touch "./nested/folder/deep/more.txt"

It's not one single command but it might do the job for you.

7
  • 13
    I recommend dirname ${file} instead of cryptic ${file%/*}
    – B12Toaster
    Aug 25 '18 at 21:51
  • 5
    The question got to something I've been wanting for a long time, but while this answer got me there, it didn't give me exactly what I wanted. So I wanted to share this function that I just created mktouch() { mkdir -p $(dirname $1) && touch $1; }. I put that in my .bash_profile and now I can do mktouch dir/path/file.ext and it creates the directory and touches in one command Nov 21 '18 at 8:19
  • 7
    @BrianUnderwood probably a good idea to wrap things in quotes: mkdir -p "$(dirname "$1")" && touch "$1"
    – mwfearnley
    Nov 27 '18 at 11:46
  • Fixed in in my .bash_profile, thanks! Nov 28 '18 at 12:07
  • 2
    mkdir -p parent/child && touch $_/file.txt
    – francis
    Mar 19 '20 at 5:46

Not the answer you're looking for? Browse other questions tagged or ask your own question.