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

18

Eu quero cp aaa/deep/sea/blob.psd to bbb/deep/sea/blob.psd

Como faço a cópia se os diretórios deep e sea não existirem sob bbb , para que a cópia crie os diretórios necessários e copie o arquivo?

Agora eu recebo No such file or directory como deep e o mar não existe.

Eu olhei através das páginas de ajuda do homem e outras perguntas, mas nada aparece em mim.

O mais próximo que eu tenho é usar rcp para o diretório:

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

embora isso copie todo o diretório e conteúdo e eu só quero o único arquivo. Tentar fazer isso, no entanto, deu cp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

    
por Michael Durrant 27.06.2012 / 19:58

5 respostas

19

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

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

e use-o como

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

A propósito, o GNU cp tem uma opção --parents . É muito próximo do que você quer, mas não exatamente.
Ele também criará o diretório aaa que parece que você não precisa. No entanto, você pode primeiro copiar para aaa e copiar como:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/
    
por 27.06.2012 / 20:17
25

É fácil usar o programa install do coreutils que é normalmente usado para esse fim por sistemas de compilação como automake :

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

Note que install cria todas partes do caminho como mkdir -p , veja man install . Estou curioso porque você não incluiu por que você quer fazer isso. Chamar mkdir e cp é muito fácil.

    
por 06.05.2014 / 21:26
7

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

pax -rws ':^:dest/dir/:' file .
    
por 06.05.2014 / 21:36
6

Não conheço uma maneira de fazer isso usando cp , mas certamente é possível usar rsync :

$ rsync sourcefile dir/

em que dir é um diretório que não precisa existir. Existem muitas outras maneiras de conseguir o mesmo usando outros comandos.

    
por 06.05.2014 / 21:28
5
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Se você não tem pax (é obrigatório pelo POSIX, como um substituto padrão do cpio e do tar, que tinha muitas incompatibilidades para padronizar), use cpio -p ou tar -cf - … | tar -xf - .

    
por 28.06.2012 / 02:43