Як я можу скопіювати файл у нове місце, створивши також каталог


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.


5

Це можна зробити за допомогою наступної команди

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

Примітка. Використання "/" в кінці шляху:

  • Використовуючи "/" в кінці джерела, rsync буде копіювати вміст останньої папки. Якщо в кінці джерела не використовується "/", rsync скопіює останню папку та вміст папки.

  • Під час використання "/" в кінці пункту призначення rsync вставить дані всередину останньої папки. Якщо не використовувати "/" в кінці пункту призначення, rsync створить папку з останньою назвою папки призначення та вставить дані всередину цієї папки.


Якщо ви хочете, 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

і це має працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.