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)

13voto

Jamie McCrindle Punkte 8792

Hier ist eine Möglichkeit, dies zu tun:

mkdir -p `dirname /path/to/copy/file/to/is/very/deep/there` \
   && cp -r file /path/to/copy/file/to/is/very/deep/there

dirname gibt Ihnen das Elternverzeichnis des Zielverzeichnisses oder der Zieldatei an. mkdir -p `dirname ...` erstellt dann dieses Verzeichnis und stellt sicher, dass beim Aufruf von cp -r das richtige Basisverzeichnis vorhanden ist.

Der Vorteil gegenüber --parents ist, dass es auch dann funktioniert, wenn das letzte Element im Zielpfad ein Dateiname ist.

Und es wird unter OS X funktionieren.

0 Stimmen

Erzeugt dieser Teil 2 Verzeichnisse? dirname /path/to/copy/file/to/is/very/deep/there `?

11voto

immanski njoro Punkte 106

Das kommt zwar sehr spät, aber vielleicht hilft es einem Neuling. Wenn Sie Folgendes brauchen AUTO Verzeichnisse erstellen rsync sollte Ihr bester Freund sein.

rsync /path/to/sourcefile /path/to/tragetdir/thatdoestexist/

9voto

marcdahan Punkte 2302

Bei allem Respekt für die obigen Antworten ziehe ich es vor, rsync wie folgt zu verwenden:

$  rsync -a directory_name /path_where_to_inject_your_directory/

exemple :

$ rsync -a test /usr/local/lib/

1 Stimmen

Ich habe es versucht und folgendes Ergebnis erhalten: rsync -a bull /some/hoop/ti/doop/ploop RESULT rsync: mkdir "/some/hoop/ti/doop/ploop" failed: No such file or directory (2) rsync error: error in file IO (code 11) at main.c(675) [Receiver=3.1.2]

0 Stimmen

@thebunnyrules die müssen Sie den Pfad mit pwd Befehl (siehe :[link ] ( access.redhat.com/documentation/de-US/Red_Hat_Enterprise_Linux/ )) und fügen Sie es korrekt in Ihre Anweisung ein

0 Stimmen

Wenn ich Ihren Vorschlag richtig verstehe, schlagen Sie vor, dass ich einen vollständigen Pfad zu der von Aka verwendeten Quelle angeben soll: "$(pwd)/bull" in meinem Befehl statt nur den Dateinamen: bull? Die Sache ist die, dass der Fehler bei der Erstellung des Zielverzeichnisses durch rsync liegt, nicht bei der Quelle (bull). Mir scheint, dass rsync ein einfaches mkdir und nicht ein mkdir -p verwendet.

8voto

Leroy Dunn Punkte 331

Das ist es für mich

cp -vaR ./from ./to

1 Stimmen

Einverstanden. Unter man cp : -R If source_file designates a directory, cp copies the directory and the entire subtree connected at that point.

8voto

Dig Punkte 221

Wie oben von help_asap und spongeman vorgeschlagen, können Sie den Befehl 'install' verwenden, um Dateien in bestehende Verzeichnisse zu kopieren oder neue Zielverzeichnisse zu erstellen, wenn diese noch nicht existieren.

Option 1 install -D filename some/deep/directory/filename
kopiert die Datei in ein neues oder bestehendes Verzeichnis und gibt dem Dateinamen die Standardberechtigung 755

Option 2 install -D filename -m640 some/deep/directory/filename
wie bei Option 1, jedoch mit Dateiname 640 Berechtigungen.

Option 3 install -D filename -m640 -t some/deep/directory/
wie Option 2, jedoch wird der Dateiname in das Zielverzeichnis geschrieben, so dass der Dateiname nicht sowohl in der Quelle als auch im Ziel geschrieben werden muss.

Option 4 install -D filena* -m640 -t some/deep/directory/
wie bei Option 3, aber mit einem Platzhalter für mehrere Dateien.

Es funktioniert gut in Ubuntu und kombiniert zwei Schritte (Verzeichniserstellung und Dateikopie) in einem einzigen Schritt.

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