Ich habe bereits Terabytes an Dateien mit kopiert, rsync
aber ich habe vergessen, diese zu verwenden --archive
, um die speziellen Attribute von Dateien zu erhalten.
Ich rsync
habe diesmal erneut versucht, mit auszuführen, --archive
aber es war viel langsamer als ich erwartet hatte. Gibt es eine einfache Möglichkeit, dies durch rekursives Kopieren von Metadaten zu beschleunigen?
filesystem
rsync
metadata
Mohammad
quelle
quelle
Antworten:
OK, können Sie kopieren Eigentümer, Gruppe, Berechtigung und Zeitstempel mit dem
--reference
Parameterchown
,chmod
,touch
. Hier ist ein Skript, um dies zu tunSie sollten es mit
sudo
(um chown zuzulassen) und mit zwei Parametern ausführen : Quell- und Zielverzeichnis. Das Skript gibt nur wieder, was es tun würde. Wenn Sie zufrieden sind, ändern Sie die Zeilemyecho=echo
mitmyecho=
.quelle
touch --reference=otherfile file
. Die Antwort wurde aktualisierttouch
Designbedingt ändert sich nur die Änderungs- und Zugriffszeit, die "Erstellungszeit" wird nicht beeinflusst. (Ich denke, ext2 / 3 unterstützt das Ändern der Uhrzeit sowieso nicht, aber es könnte von Bedeutung sein, wenn Sie NTFS oder ähnliches verwenden).-c
demtouch
Befehl einen Schalter hinzu, um zu verhindern, dass leere Dateien in der Datei erstellt werden$dst_path
.WARNUNG: Ohne spezielle Problemumgehungen schneidet GNU
cp --attributes-only
die Zieldateien zumindest in Precise ab. Siehe die Bearbeitung unten.Original:
In dieser Situation möchten Sie wahrscheinlich, dass die
--attributes-only
Option von GNU cp zusammen mit--archive
dem bewährten Code alle dateisystemunabhängigen Attribute ausführt und Symlinks nicht folgt (das Folgen kann schlecht sein!):Wie bei Dateien,
cp
ist additiv mit erweiterten Attributen: Wenn sowohl Quell- und Ziel erweiterte Attribute haben sie fügt die erweiterten Attribute der Quelle zum Ziel ( und nicht zuerst alle das Ziel des xattrs zu löschen). Dies spiegelt zwar das Verhaltencp
beim Kopieren von Dateien in einen vorhandenen Baum wider , entspricht jedoch möglicherweise nicht Ihren Erwartungen.Beachten Sie auch, dass Sie das Problem nicht beheben können, wenn Sie beim ersten Mal keine festen Verknüpfungen mit
rsync
beibehalten haben, diese aber jetzt beibehalten möchten . Sie sind wahrscheinlich am besten dran, mit den richtigen Optionen (siehe meine andere Antwort ) noch einmal zu laufen und Geduld zu haben.cp
rsync
Wenn Sie diese Frage beim absichtlichen Trennen und erneuten Kombinieren von Metadaten / Dateiinhalten gefunden haben, möchten Sie vielleicht einen Blick auf den Metastore werfen, der sich in den Ubuntu-Repositorys befindet.
Quelle: GNU coreutils manual
Bearbeitet, um hinzuzufügen:
cp
ab GNUcoreutils
> = 8.17 funktioniert wie beschrieben, aber coreutils <= 8.16 schneidet Dateien beim Wiederherstellen ihrer Metadaten ab. Im Zweifelsfall nichtcp
in dieser Situation verwenden; Verwenden Siersync
mit den richtigen Optionen und / oder seien Sie geduldig.Ich würde dies nur empfehlen, wenn Sie genau wissen , was Sie tun, aber
cp
mit dem LD_PRELOAD-Trick kann verhindert werden, dass frühere GNU- Versionen Dateien abschneiden :quelle
errorno
sollte seinerrno
, richtig?rsync
mit den richtigen Optionen aufrufen , ist eine Antwort auf eine andere Frage ...Wenn Sie die Frage so behandeln, dass "rsync nur zu kopierende Metadaten enthält, warum ist sie dann so langsam und wie kann ich sie beschleunigen?":
rsync
Verwendet in der Regel MTIME-Werte als Heuristik, um unveränderte Dateien zu erkennen und zu überspringen. Ohne--archive
(insbesondere ohne--times
) bleiben die MTIMES der Zieldateien auf den Zeitpunkt eingestellt, zu dem Sie sie erneut synchronisiert haben, während die MTIMES der Quelldateien intakt bleiben (wobei manuelle Tricks von Ihnen ignoriert werden). Ohne externe Garantien von Ihnen, dass sich der Inhalt der Quelldateien nicht geändert hat, muss rsync davon ausgehen, dass dies der Fall ist, und muss sie daher prüfen und / oder erneut in das Ziel kopieren. Dies und die Tatsache , dass--whole-file
für Lokal-> lokale Synchronisierungen impliziert wird, machtrsync
ohne--times
entspricht etwacp
für lokale Synchronisierungen.Vorausgesetzt, dass die Aktualisierung des Inhalts der Zieldateien akzeptabel ist oder wenn die Quelldateien seit der Originalkopie nicht verändert wurden, sollten Sie
rsync --archive --size-only
schneller als eine naive Synchronisierung fündig werden .Wenn Sie sich nicht sicher sind, was
rsync
das Kopieren so lange dauert,rsync --archive --dry-run --itemize-changes ...
informieren Sie sich ausführlich, wenn auch knapp.quelle
Bei lokalen Übertragungen werden, wenn sich Quelle und Ziel auf lokal bereitgestellten Dateisystemen befinden,
rsync
immer ganze Dateiinhalte kopiert. Um dies zu vermeiden, können Sie verwendenquelle
rsync
die Verknüpfung nicht verwendet werden soll, wenn sich beide Dateien im lokalen Pfad befinden. Dasrsync
Kopieren des Inhalts wird jedoch nicht verhindert .Ich musste dies remote auf einem anderen Computer ausführen, damit ich --reference nicht verwenden konnte
Ich habe das benutzt, um das Skript zu machen ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Aber stellen Sie sicher, dass keine Dateinamen mit "in ihnen zuerst ...
find | grep '"'
Kopieren Sie anschließend touch.sh auf Ihren Remote-Computer und führen Sie Folgendes aus:
cd <DestinationFolder>; sh /tmp/touch.sh
Es gibt auch Optionen in find -printf zum Drucken von Benutzernamen und Gruppennamen, wenn Sie diese kopieren möchten.
quelle
find
. Ich war in der gleichen Situation - habe vergessen, Attribute zu kopieren, Quell- und Zieldatenträger befanden sich bereits auf unterschiedlichen Rechnern und wollten das nicht wirklich rückgängig machen.