Ein Verzeichnis zu kopieren, scheint banal zu sein, bis das Verzeichnis versteckte Dateien, symbolische Links oder nützliche Daten für ein Skript enthält. cp -r kopiert die Verzeichnisstruktur, aber cp -a ist oft die bessere Wahl, um ein Arbeitsverzeichnis zu duplizieren, ohne seine Attribute zu ändern.
Bevor Sie die Quelle löschen, erstellen Sie die Kopie, überprüfen Sie sie und öffnen Sie einige Dateien. Ein erfolgreicher Befehl beweist nicht, dass Sie den richtigen Pfad gewählt haben.

Wählen zwischen cp -r und cp -a
cp -r geht in die Unterverzeichnisse. Einträge, die mit einem Punkt beginnen, sind eingeschlossen, wenn Sie das Verzeichnis selbst kopieren. Vermeiden Sie jedoch das Globbing der Art *, wenn Sie auch die versteckten Dateien erwarten: Die Shell ignoriert sie standardmäßig.
cp -a aktiviert den Archivmodus. Es bewahrt so weit wie möglich die Berechtigungen, Eigentümer, Daten, symbolischen Links und physischen Links. Für ein lokales Backup oder eine Verzeichnismigration ist dies in der Regel der Befehl, den man bevorzugen sollte. Es kann hohe Rechte erfordern, wenn Sie einen Besitzer bewahren müssen, den Ihr Konto nicht festlegen kann.
cp -a -- /srv/app/ /srv/app-copie/
Das -- trennt die Optionen von den Pfaden. Es verhindert, dass eine Datei, die mit einem Bindestrich beginnt, als Option interpretiert wird. Der abschließende Slash der Quelle bedeutet hier, dass Sie deren Inhalt in /srv/app-copie/ kopieren. Wenn dieses Verzeichnis bereits existiert, überprüfen Sie die erhaltene Struktur, bevor Sie fortfahren.
Ein Ziel vorbereiten, ohne das falsche Verzeichnis zu überschreiben
Erstellen Sie zuerst ein klar benanntes Ziel und listen Sie die beiden Seiten auf. Auf einem Server starten Sie nicht eine rekursive Kopie in einen manuell erstellten Pfad in einem Skript, ohne diesen Pfad in den Logs anzuzeigen.
mkdir -p -- /srv/app-copie
find /srv/app -maxdepth 1 -printf '%fn' | sort
find /srv/app-copie -maxdepth 1 -printf '%fn' | sort
Wenn Sie ein Überschreiben während eines ersten Versuchs verweigern möchten, fügen Sie -n hinzu. Diese Option ignoriert bereits vorhandene Dateien, daher eignet sie sich nicht für eine vollständige Synchronisierung. Um vorhandene Daten zu ersetzen, erstellen Sie ein Backup oder arbeiten Sie in einem neuen Verzeichnis und wechseln Sie dann den Dienst zur validierten Kopie.
Dateien, Rechte und Links überprüfen
Beginnen Sie mit der Überprüfung der versteckten Dateien und der Rechte. ls -la zeigt die Namen an, die mit einem Punkt beginnen. stat ermöglicht den Vergleich der Berechtigungen und Daten einer sensiblen Datei.
ls -la /srv/app
ls -la /srv/app-copie
stat -c '%n %a %U:%G %y' /srv/app/config.ini /srv/app-copie/config.ini
find /srv/app-copie -type l -ls
Der letzte Befehl listet die symbolischen Links auf. Mit cp -a bleibt ein Link normalerweise ein Link. Mit einer weniger geeigneten Kopie könnten Sie jedoch den Inhalt seines Ziels oder einen link, der nach dem Verschieben ungültig wird, erhalten.
- zählen Sie die Dateien mit
find ... -type f | wc -l; - öffnen Sie die wichtigste Konfigurationsdatei ;
- testen Sie das Programm gegen die Kopie, bevor Sie die Quelle löschen ;
- behalten Sie die Quelle, solange der Dienst oder das Skript seinen funktionalen Test nicht bestanden hat.
Um den Inhalt von zwei Verzeichnisbäumen zu vergleichen, signaliert diff -qr /srv/app /srv/app-copie die Dateien, die unterschiedlich sind. Es ersetzt kein Anwendungsvalidierung, aber es erkennt schnell eine unvollständige Kopie.
Wenn Sie auch die Berechtigungen nach einer Duplikation korrigieren müssen, erklärt der Leitfaden über rekursives chmod unter Linux, warum ein zu schnell ausgeführtes chmod -R ausführbare Dateien beschädigen kann. Um eine Datei vor der Kopie zu finden, verwenden Sie auch find unter Linux.