Wie kann ich eine Datei an einen neuen Speicherort kopieren und auch das Verzeichnis erstellen?

12

Ich möchte cpeine Datei in ein anderes Verzeichnis verschieben, aber dieses Verzeichnis existiert noch nicht.

Also würde ich tun:

mkdir /new_place
cp the_file /new_place

Kann ich das in einem machen?
Ich stelle mir so etwas vor, als cp the_file -m /new_placeob "m" für "mach dir's, die es nicht gibt" steht.

Wäre dies eine Chance, scp, rsync oder ein anderes Kopierprogramm zu verwenden?

Michael Durrant
quelle

Antworten:

17

Mit können --parentsSie die Verzeichnisse von der Quelle bis zum Ziel neu erstellen. Beispielsweise:

cp --parents ~/Downloads/test.txt ~/Desktop/

Erstellt die Unterverzeichnisse ~/Desktop/home/desgua/Downloadsund kopiert test.txtsie dann. und

cp --parents Downloads/test.txt ~/Desktop/

wird erstellen ~/Desktop/Downloads.

Desgua
quelle
5

Sie können dies mit dem folgenden Befehl tun

# rsync --recursive the_file /path/to/your/dir/that/doesn't/exists/

Hinweis: Verwendung von "/" am Ende des Pfads:

  • Wenn Sie "/" am Ende der Quelle verwenden, kopiert rsync den Inhalt des letzten Ordners. Wenn am Ende der Quelle nicht "/" verwendet wird, kopiert rsync den letzten Ordner und den Inhalt des Ordners.

  • Wenn Sie am Ende des Ziels "/" verwenden, fügt rsync die Daten in den letzten Ordner ein. Wenn Sie am Ende des Ziels nicht "/" verwenden, erstellt rsync einen Ordner mit dem Namen des letzten Zielordners und fügt die Daten in diesen Ordner ein.

OrangeTux
quelle
Wenn Sie möchten the_file, müssen Sie /am Ende Ihres neuen Verzeichnispfads ein hinzufügen .
Mfink
1

Desguas Antwort ist richtig und einfach, aber was ist, wenn Sie einen protable Weg brauchen? POSIX definiert cpohne --parentFlag, daher funktioniert es nicht auf allen Systemen.

Eine Möglichkeit besteht darin, es in Python zu schreiben, wenn es auf dem System installiert ist:

#!/usr/bin/env python3
from os import makedirs
from os.path import exists,basename
from shutil import copyfile
from sys import argv

if len(argv) < 3:
   print('Not enough args',file=stderr)
   exit(1)

filename = basename(argv[2])
dirs = argv[2].replace(filename,'')
makedirs(dirs)
copyfile(argv[1],argv[2])

Das funktioniert so:

$ ./mkdircp.py /etc/passwd $HOME/foodir/bardir/passwd.copy
$ stat --printf "%F\n" $HOME/foodir/bardir/passwd.copy
regular file
$ head -n 1 $HOME/foodir/bardir/passwd.copy
root:x:0:0:root:/root:/bin/bash
Sergiy Kolodyazhnyy
quelle
0

Sie können einfach zwei Befehle eingeben, indem Sie; Zum Beispiel:

mkdir folder; cp file.html folder

und es sollte funktionieren.

Galja Moehn
quelle