¿Cómo puedo copiar un archivo y crear los directorios de destino al mismo tiempo?

¿Cómo puedo copiar un archivo y crear los directorios de destino al mismo tiempo?

quiero cp aaa/deep/sea/blob.psdhacerlobbb/deep/sea/blob.psd

¿Cómo hago la copia si los directorios deepy seano existen bbbpara que la copia cree los directorios necesarios y copie el archivo?

Ahora mismo me pongo
No such file or directorytan profundo y el mar no existe.

Revisé las páginas de ayuda del hombre y otras preguntas, pero no me llama la atención nada.

Lo más cercano que tengo es usar rcppara el directorio:

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

aunque esto copia todo el directorio y el contenido y solo quiero un archivo. Sin embargo, tratar de hacer eso diocp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Respuesta1

Es fácil usar el installprograma desde elcoreutilsque normalmente se utiliza para este mismo propósito por sistemas de compilación comoautofabricación:

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

Nota que installcreatodopartes del camino tal como mkdir -plo hace, ver man install. Tengo curiosidad por qué no incluistepor quéquieres hacer eso. Llamar mkdiry cpes muy fácil.

Respuesta2

Intente utilizar la siguiente función para tal situación:

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

y usarlo como

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

Por cierto, GNU cptiene una --parentsopción. Está muy cerca de lo que quieres, pero no exactamente.
También creará aaaun directorio que parece que no necesitas. Sin embargo, primero puedes copiar aaay copiar como:

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

Respuesta3

Con los comandos estándar (POSIX/Unix), tienes:

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

Respuesta4

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

Si no lo tiene pax(es obligatorio por POSIX, como reemplazo estándar de cpio y tar que tenían demasiadas incompatibilidades para estandarizar), use cpio -po tar -cf - … | tar -xf -en su lugar.

información relacionada