Ich habe bereits Terabyte an Dateien mit kopiert, rsync
aber vergessen, --archive
die besonderen Attribute der Dateien beizubehalten.
Ich habe es rsync
dieses Mal noch einmal versucht, --archive
aber es war viel langsamer als erwartet. Gibt es eine einfache Möglichkeit, dies schneller zu machen, indem man Metadaten einfach rekursiv kopiert?
Antwort1
Ok, Sie können Besitzer, Gruppe, Berechtigung und Zeitstempel mit dem --reference
Parameter chown
, chmod
, kopieren touch
. Hier ist ein Skript dazu
#!/bin/bash
# Filename: cp-metadata
myecho=echo
src_path="$1"
dst_path="$2"
find "$src_path" |
while read src_file; do
dst_file="$dst_path${src_file#$src_path}"
$myecho chmod --reference="$src_file" "$dst_file"
$myecho chown --reference="$src_file" "$dst_file"
$myecho touch --reference="$src_file" "$dst_file"
done
Sie sollten es mit (um chown zuzulassen) und mit zwei Parametern ausführen sudo
: Quell- und Zielverzeichnis. Das Skript gibt nur aus, was es tun würde. Wenn es zufrieden ist, ändern Sie die Zeile myecho=echo
mit myecho=
.
Antwort2
Behandlung der Frage als „rsync kann nur Metadaten kopieren, warum ist es also so langsam und wie kann ich es schneller machen?“:
rsync
verwendet normalerweise gleiche Mtimes 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 per rsync synchronisiert haben, während die Mtimes der Quelldateien unverändert bleiben (ohne manuelle Tricks von Ihnen). Ohne externe Garantien von Ihnen, dass sich der Inhalt der Quelldateien nicht geändert hat, muss rsync davon ausgehen, dass sich dies möglicherweise geändert hat, und muss daher eine Prüfsumme erstellen und/oder sie erneut zum Ziel kopieren. Dies und die Tatsache, dass dies --whole-file
für lokale->lokale Synchronisierungen impliziert ist, macht rsync
ohne --times
ungefähr gleichwertig mit cp
für lokale Synchronisierungen.
Vorausgesetzt, dass das Aktualisieren des Inhalts der Zieldateien akzeptabel ist oder die Quelldateien seit der Originalkopie unverändert blieben, sollte es rsync --archive --size-only
schneller gehen als mit einem einfachen rsync.
Wenn Sie sich nicht sicher sind, warum rsync
das Kopieren so lange dauert, rsync --archive --dry-run --itemize-changes ...
erfahren Sie alles in erschöpfenden, wenn auch knappen Einzelheiten.
Antwort3
ACHTUNG: Ohne spezielle Workarounds cp --attributes-only
kürzt GNU die Zieldateien, zumindest in Precise. Siehe die Bearbeitung unten.
Original:
In dieser Situation möchten Sie wahrscheinlich die Option von GNU cp --attributes-only
zusammen mit verwenden, --archive
da es sich dabei um bewährten Code handelt, der alle dateisystemunabhängigen Attribute ausführt und keinen symbolischen Links folgt (ihnen zu folgen kann schlecht sein!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Wie bei Dateien cp
ist es additiv mit erweiterten Attributen: wenn sowohl Quelle als auch Ziel erweiterte Attribute haben,fügt hinzudie erweiterten Attribute der Quelle zum Ziel (anstatt zuerst alle xattrs des Ziels zu löschen). Dies spiegelt zwar das cp
Verhalten wider, wenn Sie Dateien in einen vorhandenen Baum kopieren, entspricht aber möglicherweise nicht Ihren Erwartungen.
Beachten Sie auch, dass, wenn Sie beim ersten Mal keine Hardlinks beibehalten haben, rsync
diese aber jetzt beibehalten möchten,cp
Gewohnheitbeheben Sie das für Sie; Sie sind wahrscheinlich am besten dran, es rsync
mit den richtigen Optionen erneut auszuführen (siehe meineandere Antwort) und Geduld zu haben.
Wenn Sie diese Frage gefunden haben, während Sie nachabsichtlichMetadaten/Dateiinhalte trennen und neu kombinieren möchten, dann sollten Sie einen Blick aufMetastore - Der Metastorewelches sich in den Ubuntu-Repositories befindet.
Quelle:GNU Coreutils-Handbuch
Bearbeitet, um hinzuzufügen:
cp
ab GNU coreutils
>= 8.17 und höher funktionieren wie beschrieben, aber coreutils <= 8.16 kürzen Dateien beim Wiederherstellen ihrer Metadaten. Im Zweifelsfall verwenden Sie es nicht cp
in dieser Situation; verwenden Sie es rsync
mitdie richtigen Optionenund/oder geduldig sein.
Ich würde dies nicht empfehlen, es sei denn, Sie verstehen genau, was Sie tun, aber frühere GNU-Versionen cp
können daran gehindert werden, Dateien zu kürzen, indem manLD_PRELOAD-Trick:
/*
* File: no_trunc.c
* Author: D.J. Capelis with minor changes by Zak Wilcox
*
* Compile:
* gcc -fPIC -c -o no_trunc.o no_trunc.c
* gcc -shared -o no_trunc.so no_trunc.o -ldl
*
* Use:
* LD_PRELOAD="./no_trunc.so" cp --archive --attributes-only <src...> <dest>
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char *pathname, int flags, ...);
int (*_open64)(const char *pathname, int flags, ...);
int open(const char *pathname, int flags, mode_t mode) {
_open = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
flags &= ~(O_TRUNC);
return _open(pathname, flags, mode);
}
int open64(const char *pathname, int flags, mode_t mode) {
_open64 = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
flags &= ~(O_TRUNC);
return _open64(pathname, flags, mode);
}
Antwort4
Bei lokalen Übertragungen, wenn Quelle und Ziel auf lokal gemounteten Dateisystemen liegen, rsync
wird immer der gesamte Dateiinhalt kopiert. Um dies zu vermeiden, können Sie verwenden
rsync -a --no-whole-file source dest