![Как можно скопировать файл и одновременно создать целевые каталоги?](https://rvso.com/image/23555/%D0%9A%D0%B0%D0%BA%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%81%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B8%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D1%8B%D0%B5%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B8%3F.png)
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 -
.