Jak mogę skopiować plik i jednocześnie utworzyć katalogi docelowe?

20

Chcę cp aaa/deep/sea/blob.psd, abybbb/deep/sea/blob.psd

Jak wykonać kopię, jeśli nie istnieją katalogi deepi , aby kopia tworzyła potrzebne katalogi i kopiowała plik?seabbb

W tej chwili jestem
No such file or directorytak głęboki, że morze nie istnieje.

Spojrzałem na strony pomocy mężczyzny i inne pytania, ale nic na mnie nie wyskoczyło.

Najbliżej korzystam rcpz katalogu:

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

chociaż to kopiuje cały katalog i zawartość, a ja chcę tylko jeden plik. Jednak próba zrobienia tego dałacp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Michael Durrant
źródło

Odpowiedzi:

19

Spróbuj użyć takiej następnej funkcji w takiej sytuacji:

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

i użyj go jako

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

Nawiasem mówiąc, GNU cpma --parentsopcję. Jest naprawdę blisko tego, czego chcesz, ale nie do końca.
Stworzy również aaakatalog, który wydaje się, że nie potrzebujesz. Możesz jednak najpierw zapisać na płycie CD aaai skopiować:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/
pośpiech
źródło
24

Łatwo jest używać installprogramu z coreutils, który jest zwykle używany do tego właśnie celu w systemach takich jak automake :

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

Zauważ, że installtworzy wszystkie części ścieżki tak jak mkdir -probi, patrz man install. Jestem ciekawy, dlaczego nie podałeś, dlaczego chcesz to zrobić. Dzwonienie mkdiri cpjest bardzo łatwe.

Pavel Šimerda
źródło
2
Wydaje mi się, że na to pytanie jest wiele dobrych odpowiedzi, ale to otrzymuję mój głos, ponieważ jest najbardziej przenośny. rsyncOdpowiedź będzie tworzyć tylko 1 katalog, a paxnie wydaje się być powszechne.
Patrick
Użyj -dzamiast -Dna komputerze Mac.
Matt M.
zwróć uwagę, że to polecenie tworzy pliki docelowe z uprawnieniami 755( rwxr-xr-x), co prawdopodobnie nie jest pożądane. możesz określić coś innego za pomocą -mprzełącznika, ale nie mogłem znaleźć sposobu, aby zachować uprawnienia do plików :(
törzsmókus
6

Dzięki standardowym poleceniom (POSIX / Unix) masz:

pax -rws ':^:dest/dir/:' file .
Stéphane Chazelas
źródło
1
Ciekawy. Nigdy wcześniej nie słyszałem o Paxie. Chociaż podoba mi się jego koncepcja. Niestety, mimo że jest w POSIX, wydaje się, że bardzo niewiele dystrybucji instaluje go domyślnie :-(
Patrick
@Patrick - jeśli przeskoczysz do samego końca info tar- gdzieś w części poświęconej przenośności - myślę, że przekonasz się, że GNU tartwierdzi, że jest w pełni paxkompatybilny. I tak zrobiłem, chociaż nigdy nie udało mi się wystawić tych roszczeń na próbę.
mikeserv
5

Nie wiem, jak to zrobić cp, ale z pewnością jest to możliwe przy użyciu rsync:

$ rsync sourcefile dir/

gdzie dirjest katalog, który nie musi istnieć. Istnieje wiele innych sposobów osiągnięcia tego samego za pomocą innych poleceń.

mjturner
źródło
3
Musisz rsync -Rzachować
heirarchię
@glennjackman Rzeczywiście, „właściwe” użycie rsyncwymaga więcej opcji, ale pytanie dotyczyło po prostu utworzenia nieistniejącego katalogu docelowego, stąd moja krótka odpowiedź :)
mjturner
1
Przynajmniej GNU cpma taką --parentsopcję.
peterph
2
@peterph Rzeczywiście, ale wtedy masz ograniczoną nazwę katalogu docelowego
mjturner
4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Jeśli nie masz pax(jest to wymagane przez POSIX, jako standardowy zamiennik cpio i tar, który miał zbyt wiele niezgodności do standaryzacji), użyj cpio -plub tar -cf - … | tar -xf -zamiast tego.

Gilles „SO- przestań być zły”
źródło