Como posso copiar um arquivo para um novo local, criando o diretório também

12

Quero cpum arquivo para outro diretório, mas esse diretório ainda não existe.

Então eu faria:

mkdir /new_place
cp the_file /new_place

Posso fazer isso em um?
Eu imagino algo como cp the_file -m /new_placese "m" significasse "faça dir's que não existem"

Esta seria uma chance de usar scp, rsync ou outro utilitário de cópia?

Michael Durrant
fonte

Respostas:

17

Com --parentsvocê pode recriar os diretórios da origem ao destino. Por exemplo:

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

Criará os subdiretórios ~/Desktop/home/desgua/Downloadse depois copiará test.txtpara ele; e

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

criará ~/Desktop/Downloads.

desgua
fonte
5

Você pode fazer isso com o seguinte comando

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

Nota: Use "/" no final do caminho:

  • Ao usar "/" no final da fonte, o rsync copiará o conteúdo da última pasta. Quando não estiver usando "/" no final da fonte, o rsync copiará a última pasta e o conteúdo da pasta.

  • Ao usar "/" no final do destino, o rsync colará os dados dentro da última pasta. Quando não estiver usando "/" no final do destino, o rsync criará uma pasta com o último nome da pasta de destino e colará os dados dentro dessa pasta.

OrangeTux
fonte
Se você quiser, the_fileadicione um /no final do seu novo caminho de diretório.
mfink
1

a resposta de desgua é uma maneira correta e simples, mas e se você precisar de uma maneira protegida? O POSIX define cpsem --parentsinalizador, portanto não funcionará em todos os sistemas.

Uma opção é escrevê-lo em Python, se estiver instalado no 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])

Isso funciona da seguinte maneira:

$ ./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
fonte
0

Você pode digitar facilmente dois comandos usando;. Por exemplo:

mkdir folder; cp file.html folder

e deve funcionar.

Galja Moehn
fonte