631 Stimmen

Linux: Kopieren und Erstellen des Zielverzeichnisses, wenn es nicht existiert

Ich möchte einen Befehl (oder wahrscheinlich eine Option für cp), der das Zielverzeichnis erstellt, wenn es nicht existiert.

Beispiel:

cp -? file /path/to/copy/file/to/is/very/deep/there

9 Stimmen

Die akzeptierte Antwort ist falsch (es gibt eine solche Option für cp). Siehe zweite Antwort von Paul Whipp.

1 Stimmen

@Ronenz, ich stimme zu, dass es eine erwähnenswerte Option in GNU gibt cp (wie von Paul Whipp beantwortet), aber es ist nicht so allgemein, wie es der OP wollte. Sie kann kopieren a/foo/bar/file まで b/foo/bar/file aber er kann nicht kopieren file まで b/foo/bar/file . (d. h. es funktioniert nur, um übergeordnete Verzeichnisse zu erstellen, die im Fall der ersten Datei bereits vorhanden waren, aber es kann keine beliebigen Verzeichnisse erstellen)

0voto

danuker Punkte 782
rsync file /path/to/copy/file/to/is/very/deep/there

Das könnte funktionieren, wenn Sie die richtige Art von rsync .

1 Stimmen

Das funktioniert bei mir nicht - ich erhalte "No such file or directory" auf dem dest-Verzeichnis

0voto

Ivan Babiychuk Punkte 1

Sie können verwenden find mit Perl . Der Befehl wird so lauten:

find file | perl -lne '$t = "/path/to/copy/file/to/is/very/deep/there/"; /^(.+)\/.+$/; `mkdir -p $t$1` unless(-d "$t$1"); `cp $_ $t$_` unless(-f "$t$_");'

Mit diesem Befehl wird das Verzeichnis $t wenn sie nicht existiert. Und dann kopieren file in $t nur wenn file existiert innerhalb $t .

0voto

Gemini Agaloos Punkte 1

Dies funktioniert mit GNU /bin/bash Version 3.2 unter MacOS (getestet auf Catalina und Big Sur)

cp -Rv <existing-source-folder>/   <non-existing-2becreated-destination-folder>

die Option "v" steht für "ausführlich".

Und die Option "-R" steht für "Rekursiv".

man's full description of -R is:

Wenn source_file ein Verzeichnis angibt, kopiert cp das Verzeichnis und den gesamten Teilbaum, der an diesem Punkt angeschlossen ist. Wenn die Quelldatei mit einem / endet, wird der Inhalt des Verzeichnisses kopiert und nicht das Verzeichnis selbst. Diese Option bewirkt auch, dass symbolische Links kopiert werden, anstatt sie umzuleiten, und dass cp spezielle Dateien erstellt, anstatt sie als normale Dateien zu kopieren. Die erstellten Verzeichnisse haben den gleichen Modus wie das entsprechende Quellverzeichnis, unverändert durch die umask des Prozesses.

Im Modus -R setzt cp den Kopiervorgang auch dann fort, wenn Fehler entdeckt werden.

Beachten Sie, dass cp hart verlinkte Dateien als separate Dateien kopiert. Wenn Sie harte Links beibehalten müssen, sollten Sie stattdessen tar(1), cpio(1) oder pax(1) verwenden.

Im folgenden Beispiel verwende ich ein "/" am Ende von existingfolder, damit der gesamte Inhalt von existingfolder (und nicht der Ordner selbst) in newfolder kopiert wird:

cp -Rv existingfolder/  newfolder

Versuchen Sie es.

-1voto

sdinesh94 Punkte 1068

Nehmen wir an, Sie machen etwas wie

cp file1.txt A/B/C/D/file.txt

wobei A/B/C/D Verzeichnisse sind, die noch nicht existieren

Eine mögliche Lösung sieht folgendermaßen aus

DIR=$(dirname A/B/C/D/file.txt)
# DIR= "A/B/C/D"
mkdir -p $DIR
cp file1.txt A/B/C/D/file.txt

Ich hoffe, das hilft!

-1voto

Harshad Panmand Punkte 242

Nur für macOS

rsync -R <source file path> destination_folder

Für macOS --parents Option von cp Funktioniert nicht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X