Come posso copiare un file e creare contemporaneamente le directory di destinazione?


20

Voglio cp aaa/deep/sea/blob.psdfarlobbb/deep/sea/blob.psd

Come posso fare la copia se le directory deepe seanon esistono in bbbmodo che la copia crei entrambe le directory necessarie e copi il file?

In questo momento divento
No such file or directoryprofondo e il mare non esiste.

Ho guardato le pagine di aiuto dell'uomo e altre domande, ma nulla mi salta fuori.

Il più vicino che ho sta usando rcpper la directory:

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

anche se questo copia l'intera directory e il contenuto e voglio solo un file. Provare a farlo comunque ha datocp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Risposte:


19

Prova a utilizzare tale funzione successiva per tale situazione:

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

e usalo come

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

A proposito, GNU cpha --parentsun'opzione. È molto vicino a quello che vuoi, ma non esattamente.
Creerà anche una aaadirectory che sembra non ti serva. Tuttavia puoi prima cd aaae copiare come:

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

24

È facile utilizzare il installprogramma dai coreutils che viene in genere utilizzato proprio per questo scopo da sistemi di compilazione come automake :

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

Nota che installcrea tutte le parti del percorso proprio come mkdir -pfa, vedi man install. Sono curioso di sapere perché non hai incluso perché lo desideri. Chiamare mkdired cpè molto semplice.


2
Penso che ci siano molte buone risposte su questa domanda, ma questa ottiene il mio voto in quanto è la più portatile. La rsyncrisposta creerà solo 1 directory e paxnon sembra essere comune.
Patrick,

Utilizzare -danziché -Dsu un Mac.
Matt M.

si noti che questo comando crea i file di destinazione con autorizzazioni 755( rwxr-xr-x), che probabilmente non è desiderato. puoi specificare qualcos'altro con l' -minterruttore, ma non sono riuscito a trovare un modo per mantenere solo i permessi dei file :(
törzsmókus

6

Con i comandi standard (POSIX / Unix), hai:

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

1
Interessante. Non avevo mai sentito parlare di pax prima. Anche se mi piace il suo concetto. Sfortunatamente anche se è in POSIX, sembra che siano poche le installazione installate di default :-(
Patrick

@Patrick - se salti fino alla fine di info tar- da qualche parte nella sezione dei problemi di portabilità - penso che GNU taraffermi di essere pienamente paxcompatibile. L'ho fatto comunque, anche se non sono ancora riuscito a mettere alla prova queste affermazioni.
Mikeserv,

5

Non sono a conoscenza di un modo per farlo usando cp, ma è certamente possibile usare rsync:

$ rsync sourcefile dir/

dove dirè una directory che non deve esistere. Esistono molti altri modi per ottenere lo stesso risultato usando altri comandi.


3
Devi rsync -Rpreservare la directory gerarchia
glenn jackman,

@glennjackman In effetti, l'uso "corretto" ha rsyncbisogno di più opzioni, ma la domanda era semplicemente quella di creare una directory di destinazione inesistente, quindi la mia breve risposta :)
mjturner,

1
Almeno GNU cpha l' --parentsopzione.
peterph

2
@peterph In effetti, ma poi sei limitato nella denominazione della directory di destinazione
mjturner

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

Se non lo hai pax(è richiesto da POSIX, come sostituzione standard di cpio e tar che avevano troppe incompatibilità da standardizzare), usa cpio -po tar -cf - … | tar -xf -invece.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.