¿Cómo puedo copiar un archivo a una nueva ubicación, creando también el directorio?

12

Quiero cpun archivo a otro directorio pero ese directorio aún no existe.

Entonces yo haría:

mkdir /new_place
cp the_file /new_place

¿Puedo hacer esto en uno?
Me imagino algo así como cp the_file -m /new_placesi "m" significa "crear directorios que no existen"

¿Sería esta una oportunidad para usar scp, rsync u otra utilidad de copia?

Michael Durrant
fuente

Respuestas:

17

Con --parentsusted puede recrear los directorios desde el origen hasta el destino. Por ejemplo:

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

Creará los subdirectorios ~/Desktop/home/desgua/Downloadsy luego los copiará test.txt; y

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

va a crear ~/Desktop/Downloads.

desgua
fuente
5

Puedes hacer esto con el siguiente comando

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

Nota: Uso de "/" al final de la ruta:

  • Al usar "/" al final de la fuente, rsync copiará el contenido de la última carpeta. Cuando no use "/" al final de la fuente, rsync copiará la última carpeta y el contenido de la carpeta.

  • Al usar "/" al final del destino, rsync pegará los datos dentro de la última carpeta. Cuando no use "/" al final del destino, rsync creará una carpeta con el último nombre de la carpeta de destino y pegará los datos dentro de esa carpeta.

OrangeTux
fuente
Si lo desea the_file, debe agregar un /al final de su nueva ruta de directorio.
mfink
1

La respuesta de Desgua es la manera correcta y simple, pero ¿qué pasa si necesita una forma protable? POSIX define cpsin --parentbandera, por lo que no funcionará en todos los sistemas.

Una opción es escribirlo en Python si está instalado en el 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])

Esto funciona así:

$ ./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
Sergiy Kolodyazhnyy
fuente
0

Puede escribir fácilmente dos comandos utilizando;. Por ejemplo:

mkdir folder; cp file.html folder

y debería funcionar

Galja Moehn
fuente