How can I copy a file and create the target directories at the same time?

I want to cp aaa/deep/sea/blob.psd to bbb/deep/sea/blob.psd

How do I do the copy if the deep and sea directories don’t exist under bbb so that the copy both creates the directories that are needed and copies the file?

Right now I get
No such file or directory as deep and sea don’t exist.

I looked thru the man help pages and other questions but nothing jumps out at me.

The closest I’ve got is using rcp for the directory:

rcp -r aaa/deep/sea/ bbb/deep/sea/

though this copies the whole directory and contents and I just want the one file. Trying to do that however gave cp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

It’s easy using the install program from the coreutils that is typically used for this very purpose by build systems like automake:

install -D /path/to/source /path/to/destination

Note that install creates all parts of the path just like mkdir -p does, see man install. I’m curious why you didn’t include why you want to do that. Calling mkdir and cp is very easy.

Method 2

Try to use such next function for such situation:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

and use it as

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

By the way, GNU cp has a --parents option. It’s really close to what you want, but not exactly.
It will also create aaa directory that seems you don’t need. However you can first cd to aaa and copy like:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

Method 3

With standard (POSIX/Unix) commands, you’ve got:

pax -rws ':^:dest/dir/:' file .

Method 4

I’m not aware of a way of doing it using cp, but it’s certainly possible using rsync:

$ rsync sourcefile dir/

where dir is a directory that does not have to exist. There are lots of other ways of achieving the same using other commands.

Method 5

cd aaa
pax -rw deep/sea/blob.psd ../bbb

If you don’t have pax (it’s mandated by POSIX, as a standard replacement of cpio and tar which had too many incompatibilities to standardize), use cpio -p or tar -cf - … | tar -xf - instead.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x