71

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
  • Thanks! I came here because I was having a similar issue with cat and responses below proved helpful A little more info about mkdir -p linfo.org/make_directory_tree.html
    – frederj
    Commented Aug 18, 2020 at 21:34

1 Answer 1

59

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.

9
  • 19
    I recommend dirname ${file} instead of cryptic ${file%/*}
    – Felix K.
    Commented Aug 25, 2018 at 21:51
  • 11
    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 Commented Nov 21, 2018 at 8:19
  • 9
    @BrianUnderwood probably a good idea to wrap things in quotes: mkdir -p "$(dirname "$1")" && touch "$1"
    – mwfearnley
    Commented Nov 27, 2018 at 11:46
  • Fixed in in my .bash_profile, thanks! Commented Nov 28, 2018 at 12:07
  • 5
    mkdir -p parent/child && touch $_/file.txt
    – francis
    Commented Mar 19, 2020 at 5:46

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