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