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!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
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 Verhalten cp
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 GNU coreutils
> = 8.17 funktioniert wie beschrieben, aber coreutils <= 8.16 schneidet Dateien beim Wiederherstellen ihrer Metadaten ab. Im Zweifelsfall nicht cp
in dieser Situation verwenden; Verwenden Sie rsync
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 :
/*
* 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);
}