Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

mkdir -p will create a directory; it will also make parent directories as needed.

Does a similar command exist for files, that will create a file and parent directories as needed?

share|improve this question

migrated from stackoverflow.com Jan 30 '13 at 15:05

This question came from our site for professional and enthusiast programmers.

    
Not that I am aware of.. but you could just do mkdir -p /path/to/make && touch /path/to/file... Which would make an empty file in that new directory structure you created all as needed. –  Kansha Jan 30 '13 at 9:10
1  
@Kansha combine that with dirname and basename and we'll only need the single argument; profit! :) –  akaIDIOT Jan 30 '13 at 9:12
    
Aye, good call. –  Kansha Jan 30 '13 at 9:14

4 Answers 4

up vote 6 down vote accepted

Install will do this, if given the source file /dev/null. The -D argument says to create all the parent directories:

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

Not sure if that's a bug or not—its behavior with device files isn't mentioned in the manpage. You could also just give it a blank file (newly created with mktemp, for example) as the source.

share|improve this answer

No, it does not as far as I know. But you can always use mkdir -p and touch after each other:

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"
share|improve this answer
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"
share|improve this answer
1  
The test isn't needed; mkdir -p doesn't do anything if the dir already exists. Doesn't even return an error. –  derobert Jan 30 '13 at 15:36
    
And of course, this only creates the directory. –  Michael Kjörling Jan 30 '13 at 15:40

I was going to suggest as it keeps it on one line, though setting the variable separately allows you to change it and rerun the command from the history pretty easily.

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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