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

9

Eu quero cp um 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_place if "m" significou "make dir que não existe"

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

    
por Michael Durrant 23.04.2012 / 20:23

4 respostas

13

Com --parents , você pode recriar os diretórios da origem para o destino. Por exemplo:

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

Criará os subdiretórios ~/Desktop/home/desgua/Downloads e, em seguida, copiará test.txt para ele; e

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

criará ~/Desktop/Downloads .

    
por desgua 23.04.2012 / 20:44
5

Você pode fazer isso com o seguinte comando

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

Observação: uso de "/" 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.

por OrangeTux 23.04.2012 / 20:42
0

a resposta da é a maneira correta e simples, mas e se você precisar de uma maneira protable? POSIX define cp sem --parent flag, então não funcionará em todos os sistemas.

Uma opção é escrevê-lo em Python se ele 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 assim:

$ ./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
    
por Sergiy Kolodyazhnyy 11.10.2018 / 09:50
0

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

mkdir folder; cp file.html folder

e isso deve funcionar.

    
por Galja Moehn 11.10.2018 / 13:14