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

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/

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.


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 .

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.