Linux: Kopieren und erstellen Sie das Zielverzeichnis, falls es nicht existiert
Ich will einen Befehl (oder wahrscheinlich eine option, cp) , erstellt das Zielverzeichnis (wenn es nicht vorhanden ist.
Beispiel:
cp -? file /path/to/copy/file/to/is/very/deep/there
InformationsquelleAutor der Frage flybywire | 2009-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
(es gibt keine solche option für
cp
).InformationsquelleAutor der Antwort Michael Krelin - hacker
Wenn beide der folgenden erfüllt sind:
cp
(und nicht etwa die Mac-version), unddann können Sie dies mit der
--parents
Flaggecp
. Aus der info-Seite (sichtbar auf http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation oder mitinfo cp
oderman cp
):Beispiel:
InformationsquelleAutor der Antwort Paul Whipp
Kurze Antwort
Kopieren
myfile.txt
zu/foo/bar/myfile.txt
verwenden:Wie funktioniert das?
Es gibt ein paar Bauteile, um dies zu tun, so werde ich alle die syntax Schritt für Schritt durch.
Den mkdir Dienstprogramm, wie angegeben, in der POSIX-standardmacht Verzeichnisse. Die
-p
argument, pro die docs, verursachen mkdir zuBedeutung, dass beim Aufruf
mkdir -p /foo/bar
mkdir erstellen/foo
und/foo/bar
wenn/foo
nicht bereits vorhanden ist. (Ohne-p
stattdessen wird ein Fehler ausgelöst.Den
&&
Liste Betreiber, dokumentiert, wie in der POSIX-standard (oder die Bash-manualwenn Sie bevorzugen), hat den Effekt, dasscp myfile.txt $_
wird nur ausgeführt, wennmkdir -p /foo/bar
erfolgreich ausgeführt. Dies bedeutet, dass diecp
Befehl wird nicht versuchen, auszuführen, wennmkdir
fehl einer der vielen Gründe könnte es scheitern.Schließlich die
$_
übergeben wir als zweites argumentcp
ist eine "spezielle parameter" praktisch sein kann, zur Vermeidung von sich wiederholenden lange Argumente (wie Datei-Pfade), ohne zu speichern Sie in einer Variablen. Pro das Bash-manual es:In diesem Fall, dass die
/foo/bar
passierten wirmkdir
. Also diecp
Befehl erweitert, umcp myfile.txt /foo/bar
die Kopienmyfile.txt
in das neu erstellte/foo/bar
Verzeichnis.Beachten Sie, dass
$_
ist die nicht Teil des POSIX-Standardsso dass theoretisch eine Unix-Variante haben könnte, eine shell, die keine Unterstützung für dieses Konstrukt. Allerdings weiß ich nicht von jedem modernen shells, die keine Unterstützung$_
; gewiss, Bash, Dash, zsh alle tun.Ein letzter Hinweis: der Befehl, den ich gegeben habe, am Anfang dieser Antwort davon ausgegangen, dass die Verzeichnisnamen keine Leerzeichen. Wenn man sich mit Namen mit Leerzeichen müssen Sie zitieren Sie so, dass die verschiedenen Worte, die nicht behandelt wird, wie andere Argumente zu
mkdir
odercp
. Damit der Befehl müsste eigentlich so Aussehen:InformationsquelleAutor der Antwort Mark Amery
So eine alte Frage, aber vielleicht kann ich einen Vorschlag für eine alternative Lösung.
Können Sie die
install
Programm, um die Datei zu kopieren, und erstellen Sie den Ziel-Pfad "on-the-fly".Gibt es einige Aspekte zu berücksichtigen, wenn:
Können Sie leicht ändern Sie die #2, indem die
-m
option zum festlegen von Berechtigungen für die Ziel-Datei (Beispiel:-m 664
erstellen der Ziel-Datei mit Berechtigungenrw-rw-r--
einfach wie das erstellen einer neuen Datei mittouch
).Und hier ist es das schamlose link zu der Antwort, die ich war inspiriert von =)
InformationsquelleAutor der Antwort help_asap
Shell-Funktion, die das tut, was Sie wollen, nennen es eine "begraben" kopieren, weil es gräbt ein Loch für die Datei zu Leben, in:
InformationsquelleAutor der Antwort Andy Ross
Hier ist ein Weg, es zu tun:
dirname
geben Sie das übergeordnete Ziel-Verzeichnis oder die Datei. mkdir -p `dirname ...` erstellen Sie dann das Verzeichnis, sicherzustellen, dass, wenn Sie rufen Sie cp -r die richtige Basis-Verzeichnis ist vorhanden.Den Vorteil, diese über-Eltern ist, dass es funktioniert, für den Fall, wo das Letzte element in der Ziel-Pfad ist ein mit dem Namen.
Und dann funktioniert es auf OS X.
InformationsquelleAutor der Antwort Jamie McCrindle
install -D file -m 644 -t /path/to/copy/file/to/is/very/deep/there
InformationsquelleAutor der Antwort Spongman
mit all meinen Respekt für die Antworten, ich verwende rsync wie folgt:
Beispiel:
InformationsquelleAutor der Antwort marcdahan
Fügen Sie einfach Folgendes in Ihre .bashrc, zwicken, wenn Sie brauchen. Funktioniert in Ubuntu.
E. g
Wenn Sie kopieren möchten, mit 'test' - Datei zum Zielverzeichnis "d"
Verwenden,
mkcp wird zunächst überprüft, ob das Zielverzeichnis existiert oder nicht, wenn nicht, dann machen Sie es und kopieren Quell-Datei/Verzeichnis.
InformationsquelleAutor der Antwort SD.
cp
hat mehrere Verwendungen:@AndyRoss Antwort arbeitet für die
Stil
cp
aber tut das falsche, wenn Sie dieStil
cp
.Ich denke, dass "DEST" ist zweideutig, ohne einen abschließenden Schrägstrich in dieser Verwendung (D. H. wenn das Zielverzeichnis noch nicht existiert), das ist vielleicht, warum
cp
hat nie eine option Hinzugefügt, für diese.So, hier ist meine version von diese Funktion erzwingt ein trailing slash auf der dest-dir:
InformationsquelleAutor der Antwort Rich
Diese funktionieren könnte, wenn Sie die richtige Art von
rsync
.InformationsquelleAutor der Antwort danuker
Kopie von der Quelle zu einer nicht existierenden Pfad
HINWEIS: dieser Befehl kopiert alle Dateien
cp –r
für das kopieren Sie alle Ordner und deren Inhalt$_
Arbeit als Ziel, das erstellt wird im letzten BefehlInformationsquelleAutor der Antwort developerprashant
Dies macht es für mich
InformationsquelleAutor der Antwort Leroy Dunn
Schrieb ich ein support-Skript für cp, genannt CP (Hinweis Großbuchstaben) vorgesehen, genau das zu tun. Skript wird auf Fehler überprüfen in den Pfad, den Sie haben (außer dem letzten, das ist das Ziel) und wenn alles gut geht, wird es ein mkdir -p Schritt zum erstellen der Ziel-Pfad vor dem Start der Kopie. An diesem Punkt ist die regelmäßige cp-Dienstprogramm übernimmt und alle Optionen, die Sie mit CP (wie -r, -p, -rpL wird geleitet direkt zu cp). Bevor Sie mein Skript, es gibt ein paar Dinge, die Sie brauchen, um zu verstehen.
CP nicht den Luxus haben, nehmen cues aus vorhandenen Wege, so hat es einige sehr Feste Verhaltensmuster. CP setzt Voraus, dass das Element, das Sie kopieren verworfen wird, das Ziel Weg und nicht das Ziel selbst (aka, eine umbenannte Kopie der Quelldatei/- Ordner). Bedeutung:
Diese Standard-CP-Verhalten kann verändert werden mit "--rename" Schalter. In diesem Fall wird angenommen, dass
Ein paar abschließende Hinweise: Wie bei cp, CP kopieren können mehrere items gleichzeitig mit dem letzten Pfad aufgelistet wird davon ausgegangen, dass das Ziel. Es können auch Pfade mit Leerzeichen verarbeiten, solange Sie Anführungszeichen verwenden.
CP prüft die Pfade, die Sie in und stellen Sie sicher, dass Sie existieren, bevor Sie die Kopie. Im strict-Modus (zugänglich durch die-strenge-Schalter) werden alle Dateien/Ordner kopiert werden muss, vorhanden ist oder kein kopieren erfolgt. Im relaxed-Modus (--entspannt), kopieren fortgesetzt werden, wenn mindestens eines der Elemente, die Sie aufgelistet existiert. Entspannt-Modus ist die Standardeinstellung können Sie ändern Sie den Modus temporär über den Schalter oder dauerhaft durch setzen der variable easy_going am Anfang des Skripts.
Hier ist, wie es zu installieren:
In einem nicht-root-terminal, do:
In gedit einfügen CP-Dienstprogramm und speichern:
InformationsquelleAutor der Antwort thebunnyrules
Lassen Sie uns sagen Sie etwas wie
wo A/B/C/D sind Verzeichnisse, die es noch nicht gibt
Eine mögliche Lösung ist wie folgt
hoffe, das hilft!
InformationsquelleAutor der Antwort BigDataScholar