Come posso copiare un file in una nuova posizione, creando anche la directory


12

Voglio cpun file in un'altra directory ma quella directory non esiste ancora.

Quindi farei:

mkdir /new_place
cp the_file /new_place

Posso farlo in uno?
Immagino qualcosa come cp the_file -m /new_placese "m" significasse "crea dir che non esistono"

Sarebbe un'occasione per usare scp, rsync o un'altra utility di copiatura?

Risposte:


17

Con --parentste puoi ricreare le directory dalla sorgente alla destinazione. Per esempio:

cp --parents ~/Downloads/test.txt ~/Desktop/

Creerà le sottodirectory ~/Desktop/home/desgua/Downloadse poi le copierà test.txtin essa; e

cp --parents Downloads/test.txt ~/Desktop/

creerà ~/Desktop/Downloads.


5

Puoi farlo con il seguente comando

# rsync --recursive the_file /path/to/your/dir/that/doesn't/exists/

Nota: utilizzare "/" alla fine del percorso:

  • Quando si utilizza "/" alla fine del sorgente, rsync copia il contenuto dell'ultima cartella. Quando non si utilizza "/" alla fine del sorgente, rsync copia l'ultima cartella e il contenuto della cartella.

  • Quando si utilizza "/" alla fine della destinazione, rsync incollerà i dati all'interno dell'ultima cartella. Quando non si utilizza "/" alla fine della destinazione, rsync creerà una cartella con l'ultimo nome della cartella di destinazione e incollerà i dati all'interno di quella cartella.


Se vuoi, the_filedevi aggiungere /a alla fine del tuo nuovo percorso di directory.
Mfink,

1

la risposta di desgua è un modo corretto e semplice, ma cosa succede se hai bisogno di un modo protetto? POSIX definisce cpsenza --parentflag, quindi non funzionerà su tutti i sistemi.

Un'opzione è di scriverlo in Python se è installato sul sistema:

#!/usr/bin/env python3
from os import makedirs
from os.path import exists,basename
from shutil import copyfile
from sys import argv

if len(argv) < 3:
   print('Not enough args',file=stderr)
   exit(1)

filename = basename(argv[2])
dirs = argv[2].replace(filename,'')
makedirs(dirs)
copyfile(argv[1],argv[2])

Funziona così:

$ ./mkdircp.py /etc/passwd $HOME/foodir/bardir/passwd.copy
$ stat --printf "%F\n" $HOME/foodir/bardir/passwd.copy
regular file
$ head -n 1 $HOME/foodir/bardir/passwd.copy
root:x:0:0:root:/root:/bin/bash

0

Puoi facilmente digitare due comandi usando;. Per esempio:

mkdir folder; cp file.html folder

e dovrebbe funzionare.

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.