Tach,
cp hat die unangenehme Eigenschaft, dass es beim ersten Kopieren eines Verzeichnbisbaumes an eine andere Stelle funktioniert, beim zweiten Mal (wenn das Zielverzeichnis bereits vorhanden ist) aber leider den Verzeichnisbaum als Unterverzeichnis anlegt.
cp möchte, wenn du ihm ein Verzeichnis als Ziel gibst immer erstmal neue Dateien in diesem Verzeichnis anlegen (im Gegensatz zu rsync siehe unten).
So kopiert
cp -ruav verzeichnis1/ verzeichnis2/
verzeichnis1 in verzeichnis2 hinein (hinterher existiert also verzeichnis2/verzeichnis1), egal wie die Trailing Slashes vergeben sind (Achtung bei anderen Tools wie rm und mv ist der Trailing Slash bei der Quelle unter Umständen entscheidend! Und der Slash hilft einem, falls man versehentlich eine Datei statt eines Verzeichnisses angibt, die Tools beschweren sich dann, was besonders bei Scripten relevant ist).
Ich würde mit cp die Schreibweise
cp -ruav verzeichnis1/* verzeichnis2/
verwenden; die explizit allen Inhalt von verzeichnis1 in verzeichnis2 kopiert, solange der Inahlt nicht einen zu langen String ergibt (die Wildcard wird von der Bash aufgelöst und eine Bash-Code-Zeile darf nur eine bestimmte Länge besitzen), weswegen es die Schreibweise deiner Lösung gibt:
mkdir test2 cp -rauvt test2 test/.
Das „/.“ am Ende wirkt im Endeffekt genauso wie das „/*“, indem es den Verzeichnisinhalt refferenziert (Mir fällt zumindest im Moment kein gegenbeispiel dafür ein)
rsync quelle ziel
- kennt viele Optionen, geht auch über das Netz (ssh)
Ich würde auch eher rsync nutzen, einfach, weil es im allgemeinen schneller ist (es versucht nur Dateiänderungen statt komplette Dateien zu übertragen), nicht nur das Dateidatum als Unterschiedsquelle heranziehen kann und die Dateiattribute erhalten kann; und da sähe das was du möchtest folgendermaßen aus:
rsync -av verzeichnis1/ verzeichnis2/
Man beachte den Trailing Slash beim Quellverzeichnis, ohne würde rsync sich verhalten wie cp und wiederum ein Unterverzeichnis verzeichnis1 anlegen.
mfg
Woodfighter