Wie kopieren Sie den gesamten Inhalt eines Verzeichnisses in ein anderes?
Beispielsweise:
$ 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' innerhalb '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?
.
und wie..
. Möchtest du das erklären?cp -r ./a b
funktioniert , aber nicht. Irgendeine Idee warum?r
option wird nicht benötigt. Diea
Option impliziertr
.-a
Parameter hilft in dieser Situation nicht weiter. Der Befehlcp -r ./a/. b
kopiert den Inhalt und nur den Inhalt des Verzeichnissesa
in das Verzeichnisb
. Die-a
Flagge behält Links, Zeitstempel usw. bei, was für die Frage nicht relevant ist.Zwei Verzeichnisse a und b.
Beide haben Dateien in.
Sie befinden sich in einem Verzeichnis, das a und b enthält.
-r
= rekursiv.quelle
cp
, ein Verzeichnis zu kopierena
, unda/.somedotfile
ist in enthaltena
. Wennb
vorhanden, erstellt dieser Befehl eine exakte Kopie vona
atb/a
.cp -R /some/dir/* /another/dir
Denken Sie daran, dass standardmäßig
cp
das erste Verzeichnis in das zweite Verzeichnis kopiert wird, falls das zweite vorhanden ist.Zum Beispiel
cp -r a b
kopiert das Verzeichnisa
inb
. Fallsb
nicht vorhanden, wird es mit dem Inhalt von erstellta
.Wenn Sie den Inhalt von
a
in kopieren möchtenb
(zum Beispiel, wenn Sie ein gesamtes Dateisystem in einen Mount-Punkt kopieren), verwenden Sie:wie in der vorherigen Antwort.
Beachten Sie auch, dass
-a
in einigen anderen Antworten die gleichen-dr --preserve=all
Informationen verwendet werden wie in Zeitstempeln, Kontext und erweiterten Attributen.quelle
/.
Arbeit?a/.
Stellt den Inhalt des Verzeichnisses 'a' im Gegensatz zum Verzeichnis selbst dar. In den meisten Fällen handelt es sich um ein Synonym, bei der Verwendungcp -r
wird jedoch das Standardverhalten von cp vermieden (Kopieren von INTO b).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 ist dies jedoch nicht 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.
quelle
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
... dertar cf - .
Teer ist das Quellverzeichnis, einschließlich der Punktedateien, und spuckt es zu STDOUT, das an die STDIN des weitergeleitet wirdtar xf -
.Dadurch werden sowohl die normalen als auch die ausgeblendeten Dateien kopiert, wobei das übergeordnete Verzeichnis (
..
) ausgeschlossen wird:Wenn Sie das übergeordnete Verzeichnis nicht ausschließen, erhalten Sie auch den gesamten Inhalt
..
Ihres Zielverzeichnisses.quelle
..
(z . B....
oder..super-hidden
) beginnen.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.
quelle
*
passt nicht.
oder..
, aber es funktioniert, wenn Sie verwenden.*
. Versuchen Sie esecho .*
. Sie können ausschließen.
und..
mit dem folgenden Muster:.[^.]*
..[^.]*
immer noch Namen aus, die mit..
(zB...
oder..super-hidden
) beginnen.Dies funktioniert zum rekursiven Kopieren aller Dateien und Verzeichnisse mit Ausnahme der versteckten Verzeichnisse aus dem aktuellen Verzeichnis an einen beliebigen Ort:
quelle