Як я можу скопіювати файл і створити цільові каталоги одночасно?


20

Я хочу це cp aaa/deep/sea/blob.psdзробитиbbb/deep/sea/blob.psd

Як зробити копію, якщо папки deepта seaкаталоги не існують, bbbщоб копія створювала необхідні каталоги та копіювала файл?

Зараз я розумію,
No such file or directoryяк глибока, і моря не існує.

Я дивився через сторінки допомоги чоловіка та інші питання, але нічого не вискакує на мене.

Найближче у мене є використання rcpдля каталогу:

rcp -r aaa/deep/sea/ bbb/deep/sea/

хоча це копіює весь каталог та вміст, і я просто хочу один файл. Намагання зробити це, однак, далоcp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Відповіді:


19

Спробуйте використовувати наступну функцію для такої ситуації:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

і використовувати його як

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

До речі, у GNU cpє --parentsваріант. Це дійсно близько до того, що ви хочете, але не зовсім.
Він також створить aaaкаталог, який, здається, вам не потрібен. Однак ви можете спочатку створити компакт-диск aaaі скопіювати:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

Це легко з допомогою installпрограми з Coreutils , що , як правило , використовуються для цієї мети шляхом складання систем , таких як Automake :

install -D /path/to/source /path/to/destination

Зверніть увагу, що всі частини шляху installстворюються так само, як див . Мені цікаво, чому ти не включив, чому ти хочеш це робити. Телефонувати і дуже просто.mkdir -pman installmkdircp


2
Я думаю, що на це питання є багато хороших відповідей, але цей голос отримує мій голос, оскільки він є найбільш портативним. rsyncВідповідь буде тільки створити 1 каталог, і , paxздається, не є загальним.
Патрік

Використовуйте -dзамість -DMac.
Метт М.

зауважте, що ця команда створює файли призначення з дозволами 755( rwxr-xr-x), що, ймовірно, не бажано. ви можете вказати щось інше за допомогою -mперемикача, але я не зміг знайти спосіб просто зберегти дозволи файлу :(
törzsmókus

6

За допомогою стандартних (POSIX / Unix) команд у вас є:

pax -rws ':^:dest/dir/:' file .

1
Цікаво. Я ніколи раніше не чув про Пакса. Хоча мені подобається її концепція. На жаль, хоча він знаходиться в POSIX, здається, що за замовчуванням його встановлено дуже мало:
Патрік

@Patrick - якщо пропустити весь шлях до кінця info tar- десь навколо розділу щодо портативності - я думаю, ви виявите, що GNU tarстверджує, що він повністю paxсумісний. Я так чи інакше зробив, хоча я ще ніколи не обійшов поставити ці претензії на перевірку.
mikeserv

5

Я не знаю, як це зробити за допомогою cp, але це, безумовно, можливо rsync:

$ rsync sourcefile dir/

де dirкаталог, який не повинен існувати. Існує маса інших способів досягнення того ж, використовуючи інші команди.


3
Вам потрібно rsync -Rзберегти каталог heirarchy
glenn jackman

@glennjackman Дійсно, 'правильному' використанню rsyncпотрібні більше варіантів, але питання полягало лише у створенні неіснуючого цільового каталогу, звідси моя коротка відповідь :)
mjturner

1
Принаймні, у ГНУ cpє така --parentsможливість.
петерф

2
@peterph Дійсно, але тоді ви обмежені в іменуванні цільового каталогу
mjturner

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Якщо у вас немає pax(це призначено POSIX, як стандартна заміна cpio та tar, яка мала надто багато несумісностей для стандартизації), використовуйте cpio -pабо tar -cf - … | tar -xf -замість цього.

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