it-swarm.com.de

Kopieren Sie den Verzeichnisinhalt mit dem Befehl 'cp'

Wie kopieren Sie den gesamten Inhalt eines Verzeichnisses in ein anderes?

Zum Beispiel:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

Das Problem mit dem oben genannten ist, dass das Globing-Muster '*' mit den versteckten Verzeichnissen '' übereinstimmt. und '..' und Sie erhalten ein Verzeichnis 'olduser' in 'newuser' sowie den Inhalt.

Sie könnten auch so etwas tun:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Was aber, wenn newuser bereits einige Standarddateien und -verzeichnisse enthält?

Was ist die einfachste, korrekteste, am einfachsten zu merkende und nicht verspielte Methode, um den Inhalt eines Verzeichnisses mit dem einfachen Befehl 'cp' und der Shell in ein anderes zu verschieben?

33
nomount

Versuchen:

cp -ra /backup/olduser/. /home/newuser
30
nagul

Zwei Verzeichnisse a und b.

Beide haben Dateien in.

Sie befinden sich in einem Verzeichnis, das a und b enthält.

cp -r ./a b

-r = rekursiv.

23
Rich Bradshaw

Denken Sie auch daran, dass standardmäßig cp das erste Verzeichnis in das zweite Verzeichnis kopiert, falls das zweite existiert. Zum Beispiel kopiert cp -a a b ein INTO b, wenn b existiert, d. H. Es erstellt ein in b.

Wenn es nicht das ist, was Sie wollen und Sie den Inhalt von a nach b kopieren möchten (zum Beispiel, wenn Sie ein gesamtes Dateisystem in einen Mount-Punkt kopieren), verwenden Sie :

cp -a a/. b

wie in der vorherigen Antwort.

Bitte beachten Sie auch, dass -a-r enthält, sodass -ar redundant ist.

18

Wenn Sie Ihre Shell nicht ernsthaft neu konfiguriert haben, stimmt das Muster '*' nicht mit 'überein.' oder '..', wie Sie nur mit echo * überprüfen können. Stattdessen werden Dateien ausgelassen, deren Name mit einem '.' Beginnt, sodass bei Ihrem Ansatz alle versteckten Dateien fehlen. Sie können einige dieser Verhaltensweisen mit Shell-Optionen optimieren, z. B. die Option dotglob in bash. In diesem Fall handelt es sich jedoch nicht um die portable und robuste Option, nach der Sie suchen.

Wenn Sie dies mehr als ein- oder zweimal tun müssen, empfehle ich, dass Sie sich mit rsync oder unisono (je nach spezifischen Anforderungen) und sorgfältig ausgearbeiteten Quell- und Zielspezifikationen befassen.

Eine andere Alternative besteht darin, das Quellverzeichnis in einem Tarball abzulegen und es über dem vorhandenen Zielverzeichnis zu entpacken.

6

Dadurch werden sowohl die normalen als auch die ausgeblendeten Dateien kopiert, wobei das übergeordnete Verzeichnis (..) ausgeschlossen wird:

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

Wenn Sie das übergeordnete Verzeichnis nicht ausschließen, erhalten Sie den gesamten Inhalt von .. auch in Ihrem Zielverzeichnis.

2
mch

Dies funktioniert zum rekursiven Kopieren aller Dateien und Verzeichnisse mit Ausnahme der versteckten Verzeichnisse aus dem aktuellen Verzeichnis an einen beliebigen Ort:

cp -rf * ^.* 
0
Seeeve

Um Dateien zu kopieren, die mit einem Punkt beginnen, führen Sie einfach cp. * Target/aus.

Am einfachsten ist es, den Befehl cp zweimal auszuführen.

Wie Peter Eisentraut sagt, beinhalten die normalen Spielregeln nicht .. und. (hm, wie soll ich diesen Satz beenden?)

Verwenden Sie einfach -r, um es rekursiv zu machen, und -i, um cp zu veranlassen, zu fragen, ob Sie eine Datei wirklich überschreiben möchten.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/
0
gaqzi