Как я могу скопировать файл в новое место, а также создать каталог

12

Я хочу cpфайл в другой каталог, но этот каталог еще не существует.

Так что я бы сделал:

mkdir /new_place
cp the_file /new_place

Могу ли я сделать это в одном?
Я представляю что-то вроде cp the_file -m /new_place«m» означает «сделать Dir's, которые не существуют»

Будет ли это шанс использовать scp, rsync или другую утилиту для копирования?

Майкл Даррант
источник

Ответы:

17

С --parentsего помощью можно воссоздать каталоги от источника до места назначения. Например:

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

Создаст подкаталоги ~/Desktop/home/desgua/Downloadsи затем скопирует test.txtв него; и

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

создаст ~/Desktop/Downloads.

desgua
источник
5

Вы можете сделать это с помощью следующей команды

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

Примечание: использование «/» в конце пути:

  • При использовании «/» в конце исходного кода rsync скопирует содержимое последней папки. Если rsync не использует «/» в конце исходного кода, он скопирует последнюю папку и ее содержимое.

  • При использовании «/» в конце места назначения rsync вставит данные в последнюю папку. Если в конце места назначения не используется «/», rsync создаст папку с последним именем папки назначения и вставит данные в эту папку.

OrangeTux
источник
Если вы хотите, the_fileвам нужно добавить /в конец вашего нового пути к каталогу.
mfink
1

Ответ Десгуа - правильный и простой способ, но что, если вам нужен проверенный способ? POSIX определяет cpбез --parentфлага, поэтому он не будет работать во всех системах.

Один из вариантов - написать его на Python, если он установлен в системе:

#!/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])

Это работает так:

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

Вы можете легко ввести две команды с помощью;. Например:

mkdir folder; cp file.html folder

и это должно работать.

Галья Моэн
источник