Как можно скопировать файл и одновременно создать целевые каталоги?

Как можно скопировать файл и одновременно создать целевые каталоги?

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

решение1

Это легко с помощью installпрограммы отcoreutilsкоторый обычно используется именно для этой цели в системах сборки, таких какавтопроизводитель:

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

Обратите внимание, что installсоздаетвсечасти пути, как и mkdir -pделает, см man install. Мне интересно, почему вы не включилипочемувы хотите это сделать. Звоните mkdirи cpэто очень просто.

решение2

Попробуйте использовать следующую функцию для такой ситуации:

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каталог, который, кажется, вам не нужен. Однако вы можете сначала cd to aaaи скопировать, например:

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

решение3

С помощью стандартных (POSIX/Unix) команд вы получаете:

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

решение4

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

Если у вас его нет pax(он предписан POSIX как стандартная замена cpio и tar, у которых было слишком много несовместимостей для стандартизации), используйте вместо этого cpio -pили tar -cf - … | tar -xf -.

Связанный контент