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
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
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.
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
}
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 "$@"
.
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 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.
0 Stimmen
縡 Wie man den cp-Befehl alle notwendigen Ordner für das Kopieren einer Datei an einen Zielort erstellen lässt
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 kopierena/foo/bar/file
までb/foo/bar/file
aber er kann nicht kopierenfile
まで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)3 Stimmen
Das sieht nach einem netten Feature-Wunsch für cp aus. Besteht die Möglichkeit, dass wir in naher Zukunft einen solchen Befehlszeilenschalter bekommen?
0 Stimmen
Die akzeptierte Antwort ist teilweise richtig und die zweite Antwort gibt Ihnen diese Möglichkeit nicht. Die Probleme liegen bei
mkdir
Teil. Wie man es im Inneren implementiertcp
Befehl.