620 Stimmen

Wie man den cp-Befehl alle notwendigen Ordner für das Kopieren einer Datei an einen Zielort erstellen lässt

Beim Kopieren einer Datei mit cp in einen Ordner, der möglicherweise nicht existiert, wie bekomme ich cp um den Ordner zu erstellen, falls erforderlich? Ich habe Folgendes versucht:

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory

3 Stimmen

@nelaar Das Alter der Frage ist zweitrangig; ausschlaggebend sollten die Qualität und der Umfang der Antworten sein. Ich habe keine starke Präferenz für die eine oder die andere Seite, aber ich glaube nicht, dass es zu diesem Zeitpunkt die Mühe wert ist, die doppelte Beziehung umzukehren. Wenn Sie anderer Meinung sind, geben Sie bitte eine Begründung (vielleicht unter meta.stackoverflow.com für eine angemessene Sichtbarkeit und Verarbeitung).

0 Stimmen

Ich habe nach der gleichen Sache gesucht und konnte meine Antwort nicht finden, also werde ich hier posten, wie ich das gemacht habe: dirname "/nosuchdirectory/hi.txt" | while read path;do mkdir -p "$path"; done && cp -f urls-resume /nosuchdirectory/hi.txt

0 Stimmen

402voto

lhunath Punkte 111281

Zur Erweiterung der Antwort von Christian wäre die einzige zuverlässige Möglichkeit, dies zu tun, die Kombination von mkdir y cp :

mkdir -p /foo/bar && cp myfile "$_"

Nebenbei bemerkt, wenn Sie nur ein einziges Verzeichnis in einer bestehenden Hierarchie erstellen müssen, rsync kann das in einem Arbeitsgang erledigen. Ich bin ein großer Fan von rsync als ein vielseitigeres cp Ersatz, in der Tat:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.

8 Stimmen

Es ist in der obigen Antwort erwähnt, aber ich möchte es noch einmal betonen (nachdem ich ein paar Minuten vergeudet habe, weil ich das Kleingedruckte nicht beachtet habe): Die rsync obiger Befehl ist no gleichwertig mit dem mkdir/cp Befehl oben. Er erstellt nur eine einzige Ordnerebene. Eigentlich bin ich mir nicht sicher, wann er nützlich sein kann.

14 Stimmen

Außerdem, für alle, die sich über die -p Argument zu mkdir ist es im POSIX-Standard dokumentiert unter pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html und veranlasst die Erstellung von Zwischenpfadkomponenten (d. h. Sie können mkdir foo/bar/baz auch wenn foo o bar nicht bereits vorhanden sind).

14 Stimmen

"$_" ist eine bash variable - LINK FÜR WEITERE INFORMATIONEN .

135voto

Christian Punkte 3798

Ich wusste nicht, dass man das mit cp machen kann.

Sie können dies mit mkdir tun.

mkdir -p /var/path/to/your/dir

EDITAR Siehe lhunath's réponse zur Einbeziehung von cp.

49 Stimmen

Cp(1) tut das nicht. mkdir -p /foo/bar && cp myfile "$_" ist in der Tat die einzige Möglichkeit, dies zuverlässig zu tun.

0 Stimmen

Prüfen Sie diese Antwort - stackoverflow.com/a/34608146/2007944

0 Stimmen

Diese Antwort sollte nicht hier sein. Die Frage bezog sich auf cp no mkdir ...

43voto

Jeff King Punkte 309

Man kann auch den Befehl find :

find ./ -depth -print | cpio -pvd newdirpathname

1 Stimmen

Dies ist bei weitem die beste Lösung, da Sie damit Verzeichnisse erstellen können, ohne vorher den vollständigen Pfad zu kennen.

37voto

Jamie McCrindle Punkte 8792
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt

23voto

victor hugo Punkte 34636

Eine solche Möglichkeit gibt es nicht. Was Sie tun können, ist die Ausführung von mkdir -p vor dem Kopieren der Datei

Ich habe eine sehr cool Skript, mit dem Sie Dateien an Orte kopieren können, die nicht existieren

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

Speichern Sie es, geben Sie ihm Berechtigungen und führen Sie es mit

./cp-improved SOURCE DEST

Ich habe die Option -R gesetzt, aber es ist nur ein Entwurf, ich weiß, dass er noch verbessert werden kann und dass Sie ihn in vielerlei Hinsicht verbessern werden. Hoffentlich hilft es Ihnen

3 Stimmen

Bitte geben Sie Ihre Parametererweiterungen an. Sonst werden Sie unter den Fehlern leiden, die durch Wortsplitting und Pfadnamenerweiterung entstehen. Setzen Sie "" um alle Ihre $foo's.

9 Stimmen

Das führt zu merkwürdigen Ergebnissen, wenn jemand versucht, die Datei während des Kopierens umzubenennen: cp-improved /foo/file.jpg /bar/file.jpg.bak . Ich werde am Ende mit /bar/file.jpg.bak/file.jpg egal ob bar existiert oder 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