AVISO: Sem alternativas especiais, o GNU cp --attributes-only
truncará os arquivos de destino, pelo menos em Precise. Veja a edição abaixo.
Original:
Nesta situação você provavelmente quer a opção --attributes-only
do GNU cp, juntamente com --archive
, como é código testado e experimentado, faz todos os atributos agnósticos do sistema de arquivos e não segue links simbólicos (segui-los pode ser ruim!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Assim como os arquivos, cp
é aditivo com atributos estendidos: se origem e destino tiverem atributos estendidos, adiciona os atributos estendidos da origem ao destino (em vez de excluir todos os xattrs do destino primeiro ). Embora isso espelhe como o cp
se comporta se você copiar arquivos em uma árvore existente, pode não ser o que você espera.
Observe também que, se você não preservou os links físicos na primeira vez com rsync
, mas deseja preservá-los agora, então cp
não o corrigirá para você; você provavelmente é melhor re-executar rsync
com as opções corretas (veja minha outra resposta) e ser paciente.
Se você encontrou esta questão enquanto procurava deliberadamente separar e recombinar o conteúdo de metadados / arquivo, talvez queira dar uma olhada em metastore que está nos repositórios do Ubuntu.
Fonte: manual GNU coreutils
Editado para adicionar:
cp
do GNU coreutils
> = 8.17 e acima funcionarão conforme descrito, mas o coreutils < = 8.16 truncará arquivos ao restaurar seus metadados. Em caso de dúvida, não use cp
nesta situação; use rsync
com as opções certas e / ou seja paciente.
Eu não recomendaria isso a menos que você entenda completamente o que está fazendo, mas o GNU cp
anterior pode ser impedido de truncar arquivos usando o Truque 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);
}