How to create a file and parent directories in one command?

80,998

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.

Share:
80,998

Related videos on Youtube

Jeff Puckett
Author by

Jeff Puckett

Updated on September 18, 2022

Comments

  • Jeff Puckett
    Jeff Puckett almost 2 years

    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 ?

    • frederj
      frederj almost 4 years
      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
  • B12Toaster
    B12Toaster almost 6 years
    I recommend dirname ${file} instead of cryptic ${file%/*}
  • Brian Underwood
    Brian Underwood over 5 years
    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
  • mwfearnley
    mwfearnley over 5 years
    @BrianUnderwood probably a good idea to wrap things in quotes: mkdir -p "$(dirname "$1")" && touch "$1"
  • Brian Underwood
    Brian Underwood over 5 years
    Fixed in in my .bash_profile, thanks!
  • JRadness
    JRadness over 5 years
    @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.
  • francis
    francis over 4 years
    mkdir -p parent/child && touch $_/file.txt
  • RoboticRenaissance
    RoboticRenaissance about 3 years
    I hate when I see this... "How do I do X in one command?" "Oh, it's simple. Just do two commands and join them on one line". And it's like... no... they clearly want "One Command"
  • Admin
    Admin almost 2 years
    Actually, this answer contains 2 cmds put together in one line. I think this is not the answer the questioner wants!