Como posso copiar um arquivo e criar os diretórios de destino ao mesmo tempo?

Como posso copiar um arquivo e criar os diretórios de destino ao mesmo tempo?

cp aaa/deep/sea/blob.psdeu querobbb/deep/sea/blob.psd

Como faço a cópia se os diretórios deepe seanão existem bbbpara que a cópia crie os diretórios necessários e copie o arquivo?

Neste momento estou
No such file or directorytão fundo e o mar não existe.

Olhei as páginas de ajuda do homem e outras perguntas, mas nada me chamou a atenção.

O mais próximo que consegui foi usar rcppara o diretório:

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

embora isso copie todo o diretório e conteúdo e eu queira apenas um arquivo. Tentando fazer isso, no entanto, deucp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Responder1

É fácil usar o installprograma docoreutilsque normalmente é usado para esse propósito por sistemas de construção comoautomake:

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

Observe que installcriatodospartes do caminho exatamente como mkdir -pfaz, veja man install. Estou curioso para saber por que você não incluiupor quevocê quer fazer isso. Ligando mkdire cpé muito fácil.

Responder2

Tente usar a próxima função para tal situação:

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

e usá-lo como

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

A propósito, o GNU cptem uma --parentsopção. É muito próximo do que você deseja, mas não exatamente.
Ele também criará aaaum diretório que parece desnecessário. No entanto, você pode primeiro gravar aaae copiar como:

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

Responder3

Com comandos padrão (POSIX/Unix), você tem:

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

Responder4

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

Se você não tiver pax(é obrigatório pelo POSIX, como uma substituição padrão de cpio e tar que tinha muitas incompatibilidades para padronizar), use cpio -pou tar -cf - … | tar -xf -.

informação relacionada