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)

4voto

Chris Punkte 31

Ich hatte gerade das gleiche Problem. Mein Ansatz war es, einfach tar die Dateien in ein Archiv wie so:

tar cf your_archive.tar file1 /path/to/file2 path/to/even/deeper/file3

tar speichert die Dateien automatisch in der entsprechenden Struktur innerhalb des Archivs. Wenn Sie

tar xf your_archive.tar

werden die Dateien in die gewünschte Verzeichnisstruktur extrahiert.

4voto

Rich Punkte 14194

cp hat mehrere Verwendungszwecke:

$ cp --help
Usage: cp [OPTION]... [-T] SOURCE DEST
  or:  cp [OPTION]... SOURCE... DIRECTORY
  or:  cp [OPTION]... -t DIRECTORY SOURCE...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Die Antwort von @AndyRoss funktioniert für die

cp SOURCE DEST

Stil von cp , tut aber das Falsche, wenn Sie die Option

cp SOURCE... DIRECTORY/

Stil von cp .

Ich denke, dass "DEST" ohne einen abschließenden Schrägstrich in diesem Fall mehrdeutig ist (d.h. wenn das Zielverzeichnis noch nicht existiert), was vielleicht der Grund ist cp hat dafür nie eine Option vorgesehen.

Hier ist also meine Version dieser Funktion, die einen abschließenden Schrägstrich im Zielverzeichnis erzwingt:

cp-p() {
  last=${@: -1}

  if [[ $# -ge 2 && "$last" == */ ]] ; then
    # cp SOURCE... DEST/
    mkdir -p "$last" && cp "$@"
  else
    echo "cp-p: (copy, creating parent dirs)"
    echo "cp-p: Usage: cp-p SOURCE... DEST/"
  fi
}

0 Stimmen

Nur die Betrachtung des letzten Arguments und dann die cp "$@" ist eine gute Idee, denn auf diese Weise werden andere Optionen, die an die Funktion übergeben werden, an cp weitergegeben. Und du hast Recht, dass es ohne den abschließenden Schrägstrich mehrdeutig ist, aber du könntest es als Verzeichnis mit abschließendem Schrägstrich und als Dateiname ohne behandeln, d.h. im else-Zweig verwenden mkdir -p "$(dirname "$last")" && cp "$@" .

4voto

Ulf Gjerdingen Punkte 1386

Ich empfehle dringend ditto . funktioniert einfach.

ditto my/location/poop.txt this/doesnt/exist/yet/poop.txt

2 Stimmen

Es sollte darauf hingewiesen werden, dass ditto bei den meisten Linux-Distributionen nicht mitgeliefert wird.

1 Stimmen

Ich weiß nicht, warum diese Antwort nur 3 Stimmen hat, anstatt 500+. Danke @ulf-gjerdingen für die einfache und direkte Antwort.

3voto

Kopieren von der Quelle in einen nicht vorhandenen Pfad

mkdir –p /destination && cp –r /source/ $_

HINWEIS: Dieser Befehl kopiert alle Dateien

cp –r zum Kopieren aller Ordner und ihres Inhalts

$_ als Ziel arbeiten, das im letzten Befehl erstellt wurde

1voto

FredG Punkte 551

Oneliner, um ein kleines Skript zu erstellen, das als Unterbefehl verwendet werden kann, in find zum Beispiel:

set +H; echo -e "#!/bin/sh\nmkdir -p \$(dirname \"\$2\"); cp \"\$1\" \"$2\"\;" > ~/local/bin/cpmkdir; chmod +x ~/local/bin/cpmkdir

Sie können es dann wie folgt verwenden:

find -name files_you_re_lookin_for.* -exec cpmkdir {} ../extracted_copy/{} \;

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