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 ?


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


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.

| improve this answer | |
  • 3
    I recommend dirname ${file} instead of cryptic ${file%/*} – B12Toaster Aug 25 '18 at 21:51
  • 2
    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 – Brian Underwood Nov 21 '18 at 8:19
  • 2
    @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! – Brian Underwood Nov 28 '18 at 12:07
  • @mwfearnley How to properly wrap commands in nested quotes in "$(dirname "$1")". I tried your command but it created weird directories and didn't touch any files. Then I tried using single quote outside, and then tried single quote inside, and also tried backticks. Currently I have only wrapped $1 in quotes and kept dirname command itself without quotes. I should also disclose that i am using $@ instead of $1 to accept multiple parameters. – Abhinav Kulshreshtha Feb 14 '19 at 14:39

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