Wie kann ich eine Datei kopieren und gleichzeitig die Zielverzeichnisse erstellen?

20

Ich möchte cp aaa/deep/sea/blob.psdzubbb/deep/sea/blob.psd

Wie mache ich die Kopie, wenn die Verzeichnisse deepund seadarunter nicht vorhanden sind, bbbsodass die Kopie sowohl die benötigten Verzeichnisse erstellt als auch die Datei kopiert?

Im Moment werde ich
No such file or directoryso tief und Meer gibt es nicht.

Ich habe mir die Hilfeseiten und andere Fragen angesehen, aber es springt mir nichts heraus.

Das nächste, das ich habe, ist rcpfür das Verzeichnis:

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

Dies kopiert jedoch das gesamte Verzeichnis und den gesamten Inhalt, und ich möchte nur die eine Datei. Der Versuch, das zu tun, gab jedochcp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Michael Durrant
quelle

Antworten:

19

Versuchen Sie, eine solche nächste Funktion für eine solche Situation zu verwenden:

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

und benutze es als

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

GNU cphat übrigens eine --parentsOption. Es ist wirklich nah an dem, was Sie wollen, aber nicht genau.
Es wird auch ein aaaVerzeichnis erstellt, das Sie anscheinend nicht benötigen. Sie können jedoch zunächst wie folgt aaakopieren:

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

Es ist einfach, das installProgramm aus den coreutils zu verwenden , das normalerweise für diesen Zweck von Build-Systemen wie automake verwendet wird :

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

Beachten Sie, dass installschafft alle Teile des Pfades genau wie mkdir -pnicht finden man install. Ich bin gespannt, warum Sie nicht angegeben haben, warum Sie das tun möchten. Anrufen mkdirund cpist sehr einfach.

Pavel Šimerda
quelle
2
Ich denke, es gibt viele gute Antworten auf diese Frage, aber diese wird von mir als die tragbarste bewertet. Die rsyncAntwort wird nur 1 Verzeichnis erstellen und paxscheint nicht üblich zu sein.
Patrick
Verwenden Sie -danstelle von -Dauf einem Mac.
Matt M.
Beachten Sie, dass dieser Befehl die Zieldateien mit 755( rwxr-xr-x) -Berechtigungen erstellt, was wahrscheinlich nicht erwünscht ist. Sie können mit dem -mSchalter etwas anderes angeben , aber ich konnte keine Möglichkeit finden , die Dateiberechtigungen einfach
beizubehalten
6

Mit Standardbefehlen (POSIX / Unix) haben Sie:

pax -rws ':^:dest/dir/:' file .
Stéphane Chazelas
quelle
1
Interessant. Ich hatte noch nie von Pax gehört. Obwohl mir das Konzept gefällt. Leider, obwohl es in POSIX ist, scheinen es nur sehr wenige Distributionen zu sein, die es standardmäßig installieren :-(
Patrick
@Patrick - Wenn Sie bis zum Ende des Abschnitts übergehen info tar- irgendwo in der Rubrik mit den Portabilitätsbedenken - werden Sie feststellen, dass GNU tarbehauptet, vollständig paxkompatibel zu sein. Ich habe es trotzdem getan, obwohl ich noch nie dazu gekommen bin, diese Behauptungen auf die Probe zu stellen.
mikeserv
5

Mir ist keine Möglichkeit bekannt, dies zu tun cp, aber es ist sicherlich möglich, Folgendes zu verwenden rsync:

$ rsync sourcefile dir/

wo dirist ein Verzeichnis, das nicht existieren muss. Es gibt viele andere Möglichkeiten, mit anderen Befehlen dasselbe zu erreichen.

mjturner
quelle
3
Sie müssen rsync -Rdas Verzeichnis
Heirarchy
@glennjackman In der Tat, "richtige" Verwendung rsyncerfordert mehr Optionen, aber die Frage war einfach, ein nicht existierendes Zielverzeichnis zu erstellen, daher meine kurze Antwort :)
mjturner
1
Zumindest die GNU cphat die --parentsOption.
Peterph
2
@ Peterph In der Tat, aber dann sind Sie in der Benennung des Zielverzeichnisses eingeschränkt
mjturner
4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Wenn dies nicht paxder Fall ist (es wird von POSIX als Standardersatz für cpio und tar vorgeschrieben, die zu viele Inkompatibilitäten aufwiesen, um sie zu standardisieren), verwenden Sie cpio -poder tar -cf - … | tar -xf -stattdessen.

Gilles
quelle