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.
Related videos on Youtube
Author by
Jeff Puckett
Updated on September 18, 2022Comments
-
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 createmore.txt
?-
frederj almost 4 yearsThanks! I came here because I was having a similar issue with
cat
and responses below proved helpful A little more info aboutmkdir -p
linfo.org/make_directory_tree.html
-
-
B12Toaster almost 6 yearsI recommend
dirname ${file}
instead of cryptic${file%/*}
-
Brian Underwood over 5 yearsThe 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 domktouch dir/path/file.ext
and it creates the directory and touches in one command -
mwfearnley over 5 years@BrianUnderwood probably a good idea to wrap things in quotes:
mkdir -p "$(dirname "$1")" && touch "$1"
-
Brian Underwood over 5 yearsFixed in in my
.bash_profile
, thanks! -
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 over 4 yearsmkdir -p parent/child && touch $_/file.txt
-
RoboticRenaissance about 3 yearsI 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 almost 2 yearsActually, this answer contains 2 cmds put together in one line. I think this is not the answer the questioner wants!