ATTENZIONE: senza particolari soluzioni alternative, GNU cp --attributes-only
troncherà i file di destinazione, almeno in Precise. Vedi la modifica qui sotto.
Originale:
In questa situazione probabilmente vuoi l' --attributes-only
opzione GNU cp , insieme al --archive
codice provato e testato, fa tutti gli attributi indipendenti dal filesystem e non segue i collegamenti simbolici (seguirli può essere un male!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Come per i file, cp
è additivo con attributi estesi: se sia l'origine che la destinazione hanno attributi estesi, aggiunge gli attributi estesi dell'origine alla destinazione (anziché eliminare prima tutti gli xattr di destinazione). Mentre questo rispecchia il cp
comportamento se copi i file in un albero esistente, potrebbe non essere quello che ti aspetti.
Nota anche che se non hai conservato gli hard link per la prima volta, rsync
ma vuoi conservarli ora cp
, non risolverai questo problema per te; probabilmente è meglio riprovare rsync
con le giuste opzioni (vedi la mia altra risposta ) ed essere paziente.
Se hai trovato questa domanda mentre cercavi di separare e ricombinare deliberatamente i contenuti di metadati / file, allora potresti voler dare un'occhiata al metastore che si trova nei repository di Ubuntu.
Fonte: manuale GNU coreutils
Modificato per aggiungere:
cp
da GNU coreutils
> = 8.17 e successivi funzionerà come descritto, ma coreutils <= 8.16 troncerà i file quando ripristinano i loro metadati. In caso di dubbio, non utilizzare cp
in questa situazione; usare rsync
con le giuste opzioni e / o avere pazienza.
Non lo consiglierei a meno che tu non comprenda appieno quello che stai facendo, ma a GNU precedente cp
può essere impedito di troncare i file usando il trucco LD_PRELOAD :
/*
* 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);
}